我在 C++ CLI 中为使用 winsock 的服务器编写了一个套接字。套接字使用异步方法来发送、接收和接受连接。在生产环境中实现我的套接字后,发送函数停止工作,给我错误 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 上的文档中可以看出,等待数据方法也可能会陷入此错误。有人有解决这个问题的方法吗?