允许应用程序重用本地端口的规则

时间:2011-12-15 15:56:51

标签: c linux sockets linux-kernel

对于具有以下结构的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服务器,它是否匹配的第三条规则?

1 个答案:

答案 0 :(得分:1)

此游戏中有1个加N个插槽。

1 侦听套接字,已传递给bind()listen()。只有此套接字绑定到服务器侦听的端口。

2所有N 连接的套接字由连接到服务器的客户端的N'进程'创建,并由accept()返回。这些套接字用于连接客户端。这种套接字监听套接字的意义。

您引用的规则仅适用于侦听套接字

因此,如果您只运行服务器的一个实例,则第三个规则不适用,因为bind()只有一个套接字到服务器端口上的listen()。< / p>