发布网友 发布时间:2024-09-25 15:52
共1个回答
热心网友 时间:2024-10-03 06:13
我猜测你说的是linux对于socket编程时,如果没有指定本地端口,内核何时来选择一个合适的端口作为本地端口。下述回答,针对于这个假设。
一,bind()函数的调用:
内核针对不同的socket(RAW/DGRAM/STREAM)分别有三个对应的数据结构struct proto_ops 全局数据结构。其bind函数指针被赋值为inet_bind()函数。所以当我们调用bind()函数时,inet_bind()函数就会被调用。该函数会试着将对应的socket绑定到指定的端口上。
二,bind()没被调用的时候:
在下述情况下,内核会调用inet_autobind()函数,顾名思义,该函数会自动为相关的socket选择一个合适的端口。
对socket调用connect()函数。
调用sendmsg()函数。
在inet_autobind()函数中,如果socket的本地端口为0时:
对于TCP IPV4/IPV6, 最终inet_csk_get_port()会被调用,以选取合适的本地端口;
对于UDP IPV4/IPV6,udp_v4_get_port()或者udp_v6_get_port()会被调用以选取合适的本地端口;