1

是否有可能accept()(在redhat Enterprise 4/linux kernel 2.6上)为来自同一应用程序和同一台机器的同一进程的不同tcp连接返回相同的套接字值?

我很惊讶,当我检查日志文件时,许多连接在服务器端具有相同的套接字值!这怎么可能?!!

顺便说一句,我正在使用 TCP 阻塞套接字来监听。

    main(){
        int fd, clientfd, len, clientlen; 
        sockaddr_in address, clientaddress;

        fd = socket(PF_INET, SOCK_STREAM, 0);
        ....
        memset(&address, 0, sizeof address);

        address.sin_address = AF_INET;
        address.sin_port = htons(port); 
        ....
        bind(fd, &address, sizeof address);
        listen(fd, 100);
        do {
             clientfd = accept(fd, &clientaddress, &clientlen); 

             if (clientfd < 0) {
             ....
             } 

             printf("clientfd = %d", clientfd);  

             switch(fork()){
             case 0:

                    //do something else
                    exit(0);
             default:
                     ...
             }


          } while(1);
    }

我的问题是为什么printf("clientfd = %d"); 为不同的连接打印相同的数字!!!

4

3 回答 3

1

如果服务器在多个进程中运行(例如 Apache 的 mpm worker 模型),那么每个进程都有自己的文件描述符,从 0 开始编号。

换句话说,不同的进程很可能会获得完全相同的套接字文件描述符编号。但是,fd number 并没有真正的意义。它们仍然引用不同的底层对象和不同的本地 TCP 端口。

于 2013-01-26T08:09:45.463 回答
1

套接字只是一个数字。它是内核数据结构的挂钩。

顺便说一句,TCP 使用 IP。查找 RFC

于 2013-01-26T08:10:31.660 回答
0

那 printf() 根本不打印任何 FD。它缺少一个 FD 参数。您看到的可能是返回地址或堆栈上的任何其他任意垃圾。

于 2013-01-26T22:40:29.187 回答