に問題があるようですselect
。
while(!sendqueue.empty())
{
if(!atms_connection.connected)
{
//print error message
goto RECONNECT;
}
//select new
FD_ZERO(&wfds);
FD_SET(atms_connection.socket, &wfds);
tv.tv_sec = 1;
tv.tv_usec = 0;
retval = select(atms_connection.socket + 1, NULL, &wfds, NULL, &tv);
if (retval == -1) {
printf("Select failed\n");
break;
}
else if (retval) {
printf("Sent a Message.\n");
}
else {
//printf("retval value is %d\n",retval);
printf("Server buffer is full, try again...\n");
break;
}
n = write(atms_connection.socket, sendqueue.front().c_str(), sendqueue.front().length());
}
この関数はスレッドに属し、ロックを取得すると select() を使用してキューを消去し、キューが空になるまでループでソケットに書き込みます。
スレッドが最初にロックを取得したときはselect()
問題ありませんが、2 回目にロックを取得し、常に 0 を返します。
記録のために、それはしばらく前に正常に動作していましたが、それ以来そのコードを変更していません。