Sockets WinSock2发送在6次循环迭代后返回套接字错误。。。为什么?

Sockets WinSock2发送在6次循环迭代后返回套接字错误。。。为什么?,sockets,visual-c++,client,winsock,winsock2,Sockets,Visual C++,Client,Winsock,Winsock2,经过6次迭代后,send返回-1 aka SOCKET_错误。我尝试添加一个sleep函数,以便它在再次循环之前等待一秒钟,但这使得它只能重复2次。是什么导致了这个错误 #pragma comment(lib, "ws2_32.lib") #include <iostream> #include <windows.h> void main () { int reqVersion = 2; WSAD

经过6次迭代后,send返回-1 aka SOCKET_错误。我尝试添加一个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");
    }
#pragma注释(lib,“ws2_32.lib”)
#包括
#包括
空干管()
{
内部需求版本=2;
WSADATA WSADATA;
if(WSAStartup(MAKEWORD(reqVersion,0),&wsaData)==0)
{
//检查主版本是否至少为reqVersion
if(LOBYTE(wsaData.wVersion)>=reqVersion)
{
地址中的SOCKADDR_;
int addrlen=sizeof(addr);
套筒滑脱;
插座连接;
sConnect=socket(AF\u INET,SOCK\u STREAM,NULL);
addr.sin_addr.s_addr=inet_addr(“192.168.0.7”);
addr.sin_family=AF_INET;
地址:sin_端口=htons(1234);
if(connect(sConnect,(SOCKADDR*)&addr,sizeof(addr))=0
{
字符消息[10]=“你好”;

对于(inti=0;i,正如sarnold的评论所建议的那样,获得实际误差总是很有用的

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

WSAGetLastError()
中获得的错误代码非常重要,您通常可以在了解问题的含义后对其进行推理

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

在本例中,10053是
WSAECONNABORTED
,其错误文本显示“已建立的连接已被主机中的软件中止。”


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

您收到了什么?我的意思是发送函数正在返回SOCKET\u ERROR常量,该常量定义为-1。是的,这个小错误隐藏了great大量可能出错的内容:大多数Windows Sockets 2函数在返回时不会返回导致错误的具体原因。因此,请使用
WSAGetLastError
了解错误原因。很酷,这让我们知道连接至少已建立并连接了一段时间;您也可以粘贴服务器代码吗?