【问题标题】:Is it possible that Accept return a same socket value for different tcp connections on the same machine是否有可能 Accept 为同一台机器上的不同 tcp 连接返回相同的套接字值
【发布时间】:2013-01-10 04:48:21
【问题描述】:

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"); 为不同的连接打印相同的数字!!!

【问题讨论】:

  • 请显示一些源代码...以及:到底是什么问题?
  • 谢谢...数字被重用...因此,如果连接已关闭并且操作系统中出现新连接,则可以重用该数字(在同一进程中)...恕我直言没问题...

标签: linux sockets


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我确实错过了声明中的一个参数,现在更正了,虽然这不是我真正关心的问题,谢谢指出。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-22
      • 1970-01-01
      • 1970-01-01
      • 2021-04-17
      • 1970-01-01
      相关资源
      最近更新 更多