0

元の投稿:

私は、Beej の学校向けネットワーク プログラミング ガイドからネットワーク プログラミングを学んでいます。私は現在、スレッドと I/O 多重化を使用して複数の接続間で同時に通信するためのプロトタイプに取り組んでいます。接続を受信し、accept() を呼び出して、新しいファイル記述子を返す代わりに "new_fd" に新しいファイル記述子を返すと、1 が返されるという問題が発生しています。私のコードのどこにもstdoutを閉じず、accept()はソケットへの参照を新しいファイル記述子として返すことになっています。私が知る限り、スレッドは単一のプロセスで同じファイル記述子を共有するため、問題にはなりません私はそれをねじ込みました。ループバックを使って自分のパソコンから接続していたのが問題かと思いましたが、

元の投稿コード: http://pastebin.com/APQYjxg9 (すべてのコードを投稿しました)

わかりやすくするためにこれを編集します。私のコードには2つの問題がありました。最初のものはR..によってすぐに指摘され、そのコードスニペットは次のとおりです。

if (value = pthread_create((chat+chat_count), NULL, chatDaemon, (void *) &new_fd) != 0) 
{ -snip- }

void * chatDaemon(void * fd) 
{
    int my_fd = *((int *)fd);
    -snip-
}

後で何がうまくいかなかったのかを理解し、回答を投稿しました。そのためのコード スニペットは次のとおりです。

if (new_fd = accept(listen_fd, (struct sockaddr*) &(remoteHost), &addrlen) != -1) { -snip-}
4

2 に答える 2

2

久しぶりに再訪。R.. が指摘した同期の欠如が問題だったでしょうが、私が経験していた問題の原因ではありませんでした。それは単に受け入れロジックの小さな構文エラーだったので、私はもともと持っていました

if (new_fd = accept(listen_fd, (struct sockaddr*) &(remoteHost), &addrlen) != -1)

これは書かれているように評価され、受け入れ時のブールチェックの結果を new_fd に返します。これは常に true に対して 1 を返していました。c がそのように操作を順序付けることに当時は気づいていなかったので、括弧で修正しました。

if ((new_fd = accept(listen_fd, (struct sockaddr*) &remoteHost), &addrelen)) != -1)
于 2015-01-08T15:49:54.950 に答える
1

あなたの問題は、での同期読み取りの欠如のよう*(int *)fdですchatDaemonfdのローカル変数へのポインターでありnew_fd、読み取りmain前またはchatDaemon読み取り中に変更される可能性があり、未定義の動作を引き起こします。intfd を格納して解放するためのストレージを割り当てるか、参照によって fd を渡そうとするのではなく、chatDaemon(できれば) 単にキャストして戻す必要があります。void *

于 2014-11-07T03:24:42.343 に答える