[英]Error:10035 Winsock Send
下午好,最近發現一個執行中的問題,正在生成錯誤10035,生成錯誤的次數是錯誤的數倍,該錯誤導致客戶端連接不再是遠程的,並且在沒有仿真器的情況下存在延遲。 與錯誤的相似性,我找不到解決方案,如果有人可以向我介紹如何解決此錯誤,我感謝。 代碼如下:
xxxx:發送軟件包時發生錯誤。 發送總數:500。錯誤:10035 xxxx:發送程序包時出錯。 要發送的總數:568。錯誤:10035
BOOL CUser::SendMessageA(void)
{
if(Socket.Socket <= 0)
{
Socket.nSendPosition = 0;
Socket.nSentPosition = 0;
return false;
}
if(Socket.nSentPosition > 0)
RefreshSendBuffer();
if(Socket.nSendPosition > MAX_BUFFER || Socket.nSendPosition < 0 || Socket.Socket < 0)
{
Log(SERVER_SIDE, LOG_ERROR, "Send, 1");
return false;
}
if(Socket.nSentPosition > Socket.nSendPosition || Socket.nSentPosition > MAX_BUFFER || Socket.nSentPosition < 0)
{
Log(SERVER_SIDE, LOG_ERROR, "Send, 2");
Socket.nSendPosition = 0;
Socket.nSentPosition = 0;
}
INT32 err = 0;
for(INT32 i = 0; i < 1; i++)
{
INT32 LOCAL_68 = Socket.nSendPosition - Socket.nSentPosition;
INT32 LOCAL_69 = send(Socket.Socket, (char*)Socket.sendBuffer + Socket.nSentPosition, LOCAL_68, 0);
if(LOCAL_69 != -1)
Socket.nSentPosition += LOCAL_69;
else
err = WSAGetLastError();
}
if(err != 0)
{
CheckIdle(clientId);
Socket.Error++;
if(Socket.Error < 10)
Log(clientId, LOG_INGAME, "Erro no envio do pacote. Total a ser enviado: %d. Error: %d", Socket.nSendPosition, err);
}
if(Socket.nSentPosition >= Socket.nSendPosition || err != 0)
{
Socket.nSendPosition = 0;
Socket.nSentPosition = 0;
return true;
}
if(Socket.nSendPosition > MAX_BUFFER)
return false;
return true;
}
我不知道是否有可能撤消以下錯誤或某種類型的錯誤,因為發生這種錯誤時,它幾乎立即會導致用戶斷開連接,但仍保持連接狀態。
錯誤10035是WSAWOULDBLOCK
,這不是致命錯誤,但是您將其視為錯誤。
顯然,您使用的是非阻塞套接字,否則您一開始就不會遇到此“錯誤”。 因此,您需要處理send()
可能無法阻塞調用線程的可能性(因為接收者沒有足夠的緩沖區空間來接收更多數據)。
只需再次重試相同的send()
操作,最好在調用select()
等待它(有一個可選的超時),以便接收器在再次發送數據之前釋放一些緩沖區空間。
嘗試更多類似這樣的方法:
BOOL CUser::SendMessageA(void)
{
if (Socket.Socket == INVALID_SOCKET)
{
Socket.nSendPosition = 0;
Socket.nSentPosition = 0;
return FALSE;
}
if (Socket.nSentPosition > 0)
RefreshSendBuffer();
if (Socket.nSendPosition > MAX_BUFFER || Socket.nSendPosition < 0 || Socket.Socket == INVALID_SOCKET)
{
Log(SERVER_SIDE, LOG_ERROR, "Send, 1");
return FALSE;
}
if (Socket.nSentPosition > Socket.nSendPosition || Socket.nSentPosition > MAX_BUFFER || Socket.nSentPosition < 0)
{
Log(SERVER_SIDE, LOG_ERROR, "Send, 2");
Socket.nSendPosition = 0;
Socket.nSentPosition = 0;
}
while (Socket.nSentPosition < Socket.nSendPosition)
{
INT32 numSent = send(Socket.Socket, (char*)Socket.sendBuffer + Socket.nSentPosition, Socket.nSendPosition - Socket.nSentPosition, 0);
if (numSent != SOCKET_ERROR)
Socket.nSentPosition += numSent;
else
{
INT32 err = WSAGetLastError();
if (err != WSAWOULDBLOCK)
{
CheckIdle(clientId);
Socket.Error++;
if (Socket.Error < 10)
Log(clientId, LOG_INGAME, "Erro no envio do pacote. Total a ser enviado: %d. Error: %d", Socket.nSendPosition, err);
return FALSE;
}
// optionally call select() here to wait for the socket to become writable again...
}
}
Socket.nSendPosition = 0;
Socket.nSentPosition = 0;
return TRUE;
}
或者,如果您希望函數在發生阻塞時退出,而不是等待數據完全發送,而是在稍后的時間完成發送:
BOOL CUser::SendMessageA(void)
{
if (Socket.Socket == INVALID_SOCKET)
{
Socket.nSendPosition = 0;
Socket.nSentPosition = 0;
return FALSE;
}
if (Socket.nSentPosition > 0)
RefreshSendBuffer();
if (Socket.nSendPosition > MAX_BUFFER || Socket.nSendPosition < 0 || Socket.Socket == INVALID_SOCKET)
{
Log(SERVER_SIDE, LOG_ERROR, "Send, 1");
return FALSE;
}
if (Socket.nSentPosition > Socket.nSendPosition || Socket.nSentPosition > MAX_BUFFER || Socket.nSentPosition < 0)
{
Log(SERVER_SIDE, LOG_ERROR, "Send, 2");
Socket.nSendPosition = 0;
Socket.nSentPosition = 0;
}
INT32 numSent = send(Socket.Socket, (char*)Socket.sendBuffer + Socket.nSentPosition, Socket.nSendPosition - Socket.nSentPosition, 0);
if (numSent != SOCKET_ERROR)
Socket.nSentPosition += numSent;
else
{
INT32 err = WSAGetLastError();
if (err != WSAWOULDBLOCK)
{
CheckIdle(clientId);
Socket.Error++;
if (Socket.Error < 10)
Log(clientId, LOG_INGAME, "Erro no envio do pacote. Total a ser enviado: %d. Error: %d", Socket.nSendPosition, err);
return FALSE;
}
}
if (Socket.nSentPosition >= Socket.nSendPosition)
{
Socket.nSendPosition = 0;
Socket.nSentPosition = 0;
}
return TRUE;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.