1

プログラムで 2 つのスレッドを実行しています。一方は他方にデータを送信しています。ソケットは両方のスレッドで正常に接続されており、受信スレッドは接続を受け入れています。ただし、recv が呼び出されると、他のスレッドが送信しているにもかかわらず、何も入っていないかのようにブロックされたままになります。

送信スレッド

send(orig_sock, buf, BUFSIZ,0);
printf("Client sending chunk\n");

printf はなんとか表示されます。

受信スレッド

printf("START ACCEPTING\n");
        if ((new_sock = accept( orig_sock, (struct sockaddr *) &clnt_adr, &clnt_len)) < 0) {
            perror("accept error");
            close(orig_sock);
            return NULL;
        }
        printf("PASS ACCEPT\n");
        if ( fork( ) == 0 ) {                        // Generate a CHILD
            printf("FORK\n");
            len=recv(new_sock, buf, BUFLEN,0 );
                printf("message received");
                receiveBuffer.push(*p);
                //write(new_sock, buf, len);           
                //if ( buf[0] == '.' ) break;          

            printf("Did not receive message\n");
            close(new_sock);                         
            return NULL;
        } else
            close(new_sock);      

「FORK」までのすべてのメッセージが表示され、スレッドは recv 呼び出しでハングします。buf は次のように定義されてstatic char buf[BUFSIZ]; います。recv 呼び出しでデータが表示されない理由は何ですか?

4

1 に答える 1

3
send(orig_sock, buf, BUFSIZ,0);

if ((new_sock = accept( orig_sock, (struct sockaddr *) &clnt_adr, &clnt_len)) < 0) {

一緒に意味がありません。接続されているかorig_sock、リッスンしています。両方ではありません。でのエラー チェックの欠如が、send()このエラーを覆い隠しています。

リスニング ソケットに送信することはできません。

于 2013-06-07T07:49:43.657 に答える