1

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"); 異なる接続に対して同じ番号を出力するのかということです!!!

4

3 に答える 3

1

サーバーが複数のプロセスで実行されている場合 (mpm ワーカー モデルを使用する Apache など)、すべてのプロセスには 0 から始まる独自のファイル記述子があります。

つまり、異なるプロセスがまったく同じソケット ファイル記述子番号を取得する可能性は十分にあります。ただし、fd番号は実際には何の意味もありません。これらは依然として異なる基本オブジェクトと異なるローカル 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 に答える