簡體   English   中英

錯誤:10035 Winsock發送

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM