0

6回の反復の後、送信は-1、別名SOCKET_ERRORを返します。スリープ機能を追加して、1秒待ってから再度ループするようにしましたが、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

サーノルドのコメントが示唆しているように、実際のエラーを取得することは常に有用です。

一般に、エラーをチェックするソケットのコードは、戻り値WSAGetLastError()をチェックすることによって問題を検出するコードの後に​​を呼び出します。SOCKET_ERROR

取得するエラーコードWSAGetLastError()は重要であり、問​​題の意味がわかれば、通常は問題について推論できます。

このエラーコードのテキストは、を使用して表示するFormatMessage()か、WinError.hヘッダーで手動で検索できます。

この場合、10053はWSAECONNABORTED、「確立された接続がホストマシンのソフトウェアによって中止されました」というエラーテキストが表示されます。

したがって、接続しているサーバーが何らかの理由で接続を中止していると思います。サーバーのソースコードを見ないと、なぜそうなるのかを知るのは困難です。

于 2011-05-17T08:19:22.250 に答える