winsock を使用している C++ CLI でサーバー用のソケットを作成しました。ソケットは、接続の送受信に非同期メソッドを使用しています。実稼働環境でソケットを実装した後、送信機能が停止し、エラー WSAEWOULDBLOCK が表示されます。私のネットでの調査によると、これはソケット IO のネットワーク バッファがいっぱいであるか、ネットワークがビジー状態で現時点で操作を実行できないことを意味します。ただし、この問題に対処できる具体的な解決策は見たことがありません。私の一時的な解決策は、WSASend 関数の周りに do-while ループを作成し、スレッドを X 量の MS の間スリープさせてから再試行することでした。これにより、以前のソケット (.NET ソケット クラス) よりもはるかに長い待機時間と大きなラグ スパイクが発生しました。
データを送信するための私のコードは次のとおりです。
void Connectivity::ConnectionInformation::SendData(unsigned char data[], const int length)
{
if (isClosed || sendError)
return;
Monitor::Enter(this->syncRoot);
try
{
sendInfo->buf = (char*)data;
sendInfo->len = length;
do
{
state = 0;
if (WSASend(connection, sendInfo, 1, bytesSent, 0, NULL, NULL) == SOCKET_ERROR)
{
state = WSAGetLastError();
if (state == WSAEWOULDBLOCK)
{
Thread::Sleep(SleepTime);
//Means the networking is busy and we need to wait a bit for data to be sent
//Might wanna decrease the value since this could potentially lead to lagg
}
else if (state != WSA_IO_PENDING)
{
this->sendError = true;
//The send error bool makes sure that the close function doesn't get called
//during packet processing which could cause a lot of null reffernce exceptions.
}
}
}
while (state == WSAEWOULDBLOCK);
}
finally
{
Monitor::Exit(this->syncRoot);
}
}
データを送信できるときにコールバックを取得するために、たとえば WSAEventSelect メソッドを使用する方法はありますか? MSDN のドキュメントによると、wait for data メソッドもこのエラーでスタックする可能性があります。これを回避するための解決策はありますか?