SOCK_DGRAM类型套接字未指定IP端口时调用bind()的作用是什么?
问题解答
bind()的作用
你代码中创建的是UDP类型的socket(由SOCK_DGRAM参数指定),bind()的核心作用是将该socket与本地的IP地址、端口号进行绑定。绑定完成后,操作系统内核收到对应IP、端口的UDP报文时,会直接将报文转发到这个socket上,供程序读取处理。
为什么要主动调用bind()
TFTP是基于UDP实现的传输协议,收发两端都需要明确的本地端口来接收对方返回的报文。你也可以选择不主动调用bind(),首次调用sendto()发送数据时内核会自动完成端口分配和绑定,但主动调用bind()可以在发送任何数据前就完成绑定逻辑,你这段代码中bind()之后立刻打印了本地IP和端口信息,就是典型的需要提前获取绑定信息的场景。
为什么地址结构只填了ss_family就可以绑定成功
这是操作系统内核的默认约定规则:
- 你代码中先调用
memset(&s_in, 0, sizeof(s_in))将整个地址结构体全部清零,此时IP地址字段值为0,对应IPv4的INADDR_ANY、IPv6的in6addr_any,也就是通配地址,代表这个socket可以接收本机所有网卡上对应协议族的IP流量,不需要绑定到某一个特定的网卡IP。 - 地址结构中的端口字段也为0,内核会自动从系统临时端口池中选一个空闲的未被占用的端口分配给这个socket,不需要程序手动指定端口。
所以这种配置是合法的,内核会自动补全缺失的配置项,绑定可以正常执行成功。
内容的提问来源于stack exchange,提问作者HQW.ang
相关产品推荐
相关产品推荐

