私は単純なTCPサーバーを書いています。私が考えたモデルは、サーバーがメインスレッドでクライアント接続を受け入れ、それらを別のスレッドに引き渡して、サーバーが再び接続をリッスンできるようにすることです。私が使用したコードの関連部分を以下に掲載します。
接続を受け入れる:
void startServer () {
int serverSideSocket = 0;
int clientSideSocket = 0;
serverSideSocket = socket(AF_INET, SOCK_STREAM, 0);
if (serverSideSocket < 0) {
error("ERROR opening socket");
exit(1);
}
clientAddressLength = sizeof(clientAddress);
memset((char *) &serverAddress, 0, sizeof(serverAddress));
memset((char *) &clientAddress, 0, clientAddressLength);
serverAddress.sin_family = AF_INET;
serverAddress.sin_addr.s_addr = INADDR_ANY;
serverAddress.sin_port = htons(32000);
if (bind(serverSideSocket, (struct sockaddr *) &serverAddress, sizeof(serverAddress)) < 0) {
error("ERROR on binding");
exit(1);
}
listen(serverSideSocket, SOMAXCONN);
while(true) {
clientSideSocket = accept(serverSideSocket, (struct sockaddr *) &clientAddress, &clientAddressLength);
if (clientSideSocket < 0)
error("ERROR on accept");
processingThreadGroup->create_thread(boost::bind(process, clientSideSocket, this));
}
}
ここで、processingThreadGroup は boost::thread_group インスタンスです。プロセスメソッドでは:
void process (int clientSideSocket, DataCollector* collector) {
int numberOfCharactersRead = 0;
string buffer;
do {
char msgBuffer[1000];
numberOfCharactersRead = recv(clientSideSocket, msgBuffer, (1000 - 1), 0);
if (numberOfCharactersRead < 0) {
//display error
close(clientSideSocket);
}
else if (numberOfCharactersRead == 0)
close(clientSideSocket);
else {
printf("%s", msgBuffer);
memset(msgBuffer, 0, 1000);
}
} while (numberOfCharactersRead > 0);
}
しかし、コードをデバッグすると、処理スレッドが呼び出されると、メイン スレッドが接続を受け入れなくなっていることがわかりました。データは process() メソッド内でのみ読み取られます。メインスレッドはもう実行されていないようです。私が取ったアプローチの問題とそれを修正するための提案は何ですか?
編集:ここで問題を見つけたと思い、回答として更新しました。私は自分の質問に答えたので、それを受け入れません。みんな助けてくれてありがとう!