0

6 次迭代后,发送返回 -1 aka SOCKET_ERROR。我尝试添加一个 sleep 函数,这样它会在再次循环之前等待一秒钟,但这使它只会迭代 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");
    }
4

1 回答 1

1

正如 sarnold 的评论所建议的,获取实际错误总是有用的。

通常,检查错误的套接字代码将WSAGetLastError()在通过检查SOCKET_ERROR返回值来检测问题的代码之后调用。

您从中获得的错误代码WSAGetLastError()很重要,一旦您知道它的含义,您通常可以对问题进行推理。

您可以使用显示此错误代码的文本,FormatMessage()也可以在 WinError.h 标头中手动查找它。

在这种情况下,10053 是WSAECONNABORTED错误文本显示“已建立的连接已被主机中的软件中止”。

因此,我假设您要连接的服务器由于某种原因正在中止连接。如果没有看到服务器源代码,很难知道为什么会这样。

于 2011-05-17T08:19:22.250 回答