在6次循环迭代后,WinSock2发送返回SOCKET_ERROR ...为什么?

时间:2011-05-17 01:24:52

标签: sockets visual-c++ client winsock winsock2

经过6次迭代后,send返回-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 个答案:

答案 0 :(得分:1)

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

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

您从WSAGetLastError()获取的错误代码很重要,一旦您知道它的含义,您通常可以解决问题。

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

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

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