WinSock2 send возвращает SOCKET_ERROR после 6 итераций цикла ... Почему? - PullRequest
0 голосов
/ 17 мая 2011

После 6 итераций отправка возвращает -1 или SOCKET_ERROR. Я попытался добавить функцию сна, чтобы она подождала секунду, прежде чем повторить цикл, но это сделало так, что она будет повторяться только 2 раза. Что вызывает эту ошибку?

#pragma comment(lib, "ws2_32.lib")

    #include <iostream>
    #include <windows.h>
        void main ()
    {
        int reqVersion = 2;

        WSADATA wsaData;

        if (WSAStartup(MAKEWORD(reqVersion,0), &wsaData)==0)
    {
        // Check if major version is at least reqVersion
        if (LOBYTE(wsaData.wVersion) >= reqVersion)
        {
            SOCKADDR_IN addr;
            int addrlen = sizeof(addr);

            SOCKET sListen;
            SOCKET sConnect;

            sConnect = socket(AF_INET, SOCK_STREAM, NULL);

            addr.sin_addr.s_addr = inet_addr("192.168.0.7");
            addr.sin_family = AF_INET;
            addr.sin_port = htons(1234);


            if(connect(sConnect, (SOCKADDR*)&addr, sizeof(addr)) == 0)
            {
                char message[10] = "Hellooooo";
                for(int i = 0; i <50; i++)
                {
                    int sendOutcome = send(sConnect, message, sizeof(message), 0);
                    if(sendOutcome == SOCKET_ERROR)
                    {
                        std::cout << "Socket Error..." << std::endl;
                    }
                    else
                    {
                        std::cout << "SENT..." << std::endl;
                    }
                    Sleep(1000);
                }
            }
            else
            {
                std::cout << "Not Connected..." << std::endl;
            }

        }
        else
        {
            std::cout << "Required version not available..." << std::endl;
        }

        // Cleanup winsock
        if (WSACleanup()!=0)
        {
            std::cout << "Cleanup failed..." << std::endl;
        }
    }
    else
    {
        std::cout << "Startup failed..." << std::endl;
    }
        system("PAUSE");
    }

1 Ответ

1 голос
/ 17 мая 2011

Всегда полезно получить реальную ошибку, как и предполагал комментарий Сарнольда.

Как правило, код сокета, который проверяет ошибки, будет вызывать WSAGetLastError() после кода, который обнаруживает проблему путем проверки возвращаемого значения SOCKET_ERROR.

Код ошибки, который вы получаете от WSAGetLastError(), важен, и вы обычно можете найти причину проблемы, как только узнаете, что она означает.

Вы можете отобразить текст этого кода ошибки, используя FormatMessage(), или вы можете найти его вручную в заголовке WinError.h.

В этом случае 10053 - это WSAECONNABORTED, для которого в тексте ошибки указано «Установленное соединение было прервано программным обеспечением на вашем хост-компьютере».

Итак, я бы предположил, что сервер, к которому вы подключаетесь, прерывает соединение по какой-то причине. Не видя исходного кода сервера, трудно понять, почему это может быть.

...