bind()系统调用是给套接字分配一个本地协议地址,对于网际协议,协议地址是32位IPv4地址或128位IPv6地址与16位的TCP或UDP端口号的组合。如果没有通过bind()来指定本地的协议地址,在和远端通信时,内核会随机给套接字分配一个IP地址和端口号。bind()系统调用通常是在网络程序的服务器端调用,而且是必须的。如果TCP服务器不这么做,让内核来选择临时端口号而不是捆绑众所周知的端口,客户端如何发起与服务器的连接?
一、sys_bind()
bind()系统调用对应的内核实现是sys_bind(),其源码及分析如下:
/*
* Bind a name to a socket. Nothing much to do here since it's
* the protocol's responsibility to handle the local address.
*
* We move the socket address to kernel space before we call
* the protocol layer (having also checked the address is ok).
*/
SYSCALL_DEFINE3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen)
{
struct socket *sock;
struct sockaddr_storage address;
int err, fput_needed;
/*
* 以fd为索引从当前进程的文件描述符表中
* 找到对应的file实例,然后从file实例的private_data中
* 获取socket实例。
*/
sock = sockfd_lookup_light(fd, &err, &fput_needed);
if (sock) {
/*
* 将用户空间的地址拷贝到内核空间的缓冲区中。
*/
err = move_addr_to_kernel(um

本文详细介绍了sys_bind()系统调用在网络编程中的作用,特别是服务器端如何通过该调用来绑定本地协议地址。内容包括sys_bind()的内核实现过程,如套接字查找、地址拷贝的错误检查以及调用inet_bind()完成绑定操作。inet_bind()的功能虽简单,但其重要性不容忽视。
最低0.47元/天 解锁文章
747

被折叠的 条评论
为什么被折叠?



