私は問題があります。私のプログラムには、同時に 10 個の TCP サーバーが含まれています。クライアントからのリクエストが通知されるとすぐに、適切な tcp サーバー ソケットが接続を受け入れ、別のスレッドで処理します。これが実際の問題を解決する最も効率的な方法ではないことはわかっていますが、大丈夫です..
メインには、StartThread() である Peer というオブジェクトの関数を呼び出す for ループがあります。
for (it= ListOfPeers.begin();it!= ListOfPeers.end();it++)
{
(*it).second->StartThread();
}
当然、このループが使用されるいくつかの条件がありますが、できるだけコードを絞り込みたかったのです。
関数 StartThread は、各ピア オブジェクトで呼び出されます。
void StartThread()
{
pthread_t threadDoEvent;
pthread_create( &threadDoEvent, NULL, &DoEvent_helper,this);
pthread_detach(threadDoEvent);
}
void *DoEvent_helper( void *ptr ) // Helper to implement thread
{
return ((Peer *)ptr)->DoEvent();
}
DoEvent は、リクエストと接続を処理する関数です。
void* DoEvent()
{
unsigned char buffer[1024];
int rc;
int close_conn= FALSE;
int new_sd;
new_sd = accept(Socket, NULL, NULL);
if (new_sd < 0)
{
if (errno != EWOULDBLOCK)
{
perror(" accept() failed");
close_conn = TRUE;
}
}
do
{
rc = recv(new_sd, buffer, sizeof(buffer), 0);
if (rc < 0)
{
if (errno != EWOULDBLOCK)
{
perror(" recv() failed");
close_conn = TRUE;
}
break;
}
if (rc == 0)
{
printf(" Connection closed\n");
close_conn = TRUE;
break;
}
[DO SOMETHING WITH THE BUFFER]
rc = send(new_sd, buffer, len, 0);
if (rc <= 0)
{
perror(" send() failed");
close_conn = TRUE;
break;
}
}while (close_conn==FALSE);
close(new_sd);
}
私の質問は、なぜ私はエラーを受け取っているのですか: recv() failed: Bad file descriptor???? pthread_create と pthread_detach の間に sleep(1) を追加すると、すべてが機能します。誰かが私にこの状況を説明できますか? それとも私の問題を解決するのに役立ちますか?
ありがとう!