是否有可能accept()(在redhat Enterprise 4/linux内核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");为不同的连接打印相同的数字!

最佳答案

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

换句话说,很可能不同的进程将获得完全相同的套接字文件描述符号。但是,fd数字并不代表任何意义。它们仍然引用不同的基础对象和不同的本地TCP端口。

关于linux - 接受对于同一台机器上的不同tcp连接是否可能返回相同的套接字值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14535077/

10-16 20:44