对于具有以下结构的TCP服务器:
main(){
socket();
bind();
listen();
while(1){
accept();
fork();
if(child)
Process;
}
}
它为每个客户端创建一个新套接字,并使用相同的端口与所有客户端进行通信。因此,所有套接字都绑定到同一个端口。
在阅读内核代码(2.6.33.5)时,我遇到了comments:
48/* There are a few simple rules, which allow for local port reuse by
49 * an application. In essence:
50 *
51 * 1) Sockets bound to different interfaces may share a local port.
52 * Failing that, goto test 2.
53 * 2) If all sockets have sk->sk_reuse set, and none of them are in
54 * TCP_LISTEN state, the port may be shared.
55 * Failing that, goto test 3.
56 * 3) If all sockets are bound to a specific inet_sk(sk)->rcv_saddr local
57 * address, and none of them are the same, the port may be
58 * shared.
59 * Failing this, the port cannot be shared.
60 *
那么,对于上面的TCP服务器,它是否匹配的第三条规则?
答案 0 :(得分:1)
此游戏中有1个加N个插槽。
1 侦听套接字,已传递给bind()
和listen()
。只有此套接字绑定到服务器侦听的端口。
2所有N 连接的套接字由连接到服务器的客户端的N'进程'创建,并由accept()
返回。这些套接字用于连接客户端。这种套接字不听监听套接字的意义。
您引用的规则仅适用于侦听套接字。
因此,如果您只运行服务器的一个实例,则第三个规则不适用,因为bind()
只有一个套接字到服务器端口上的listen()
。< / p>