winsock: eine Verbindung schlägt fehl mit Fehler 10049 bei der Verwendung von localhost (127.0.0.1)

schrieb ich eine Klasse gekapselt einige winsock-Funktionen zu imitieren, eine einfache TCP-socket-für meine Bedürfnisse...

Wenn ich versuche, führen Sie eine einfache connect-and-send-Daten-zu-server-test der "client" nicht auf Ihren Anruf zu verbinden mit dem Fehlercode 10049 (WSAEADDRNOTAVAIL) connect-Funktion auf MSDN

Was ich Tue, ist (code weiter unten):
Server:

  1. Erstellen Sie eine Server-Socket -> Binden Sie es an Port 12345
  2. Setzen der Socket im listen-mode
  3. Anruf annehmen

Client

  1. Ein socket erstellen -> Binden Sie es an einen zufälligen port
  2. Aufruf von Connect: Verbindung zu localhost, port 12345

=> der Aufruf von connect schlägt fehl mit Fehler 10049, wie oben beschrieben

Hier ist die wichtigste Funktion, einschließlich der "server":

HANDLE hThread = NULL;
Inc::CSocketTCP ServerSock;
Inc::CSocketTCP ClientSock;

try
{

    ServerSock.Bind(L"", L"12345");
    ServerSock.Listen(10);

    //Spawn the senders-thread
    hThread = (HANDLE)_beginthreadex(nullptr, 0, Procy, nullptr, 0, nullptr);

    //accept
    ServerSock.Accept(ClientSock);


    //Adjust the maximum packet size
    ClientSock.SetPacketSize(100);


    //receive data
    std::wstring Data;
    ClientSock.Receive(Data);

    std::wcout << "Received:\t" << Data << std::endl;
}
catch(std::exception& e)
{...

Client-thread-Funktion

unsigned int WINAPI Procy(void* p)

{

Sleep(1500);
try{
    Inc::CSocketTCP SenderSock;
    SenderSock.Bind(L"", L"123456");

    SenderSock.Connect(L"localhost", L"12345");


    //Adjust packet size
    SenderSock.SetPacketSize(100);

    //Send Data
    std::wstring Data = L"Hello Bello!";
    SenderSock.Send(Data);
}
catch(std::exception& e)
{
    std::wcout << e.what() << std::endl;
}...

Die Connect-Funktion

    int Inc::CSocketTCP::Connect(const std::wstring& IP, const std::wstring& Port)
{
    //NOTE: assert that the socket is valid
    assert(m_Socket != INVALID_SOCKET);

    //for debuggin: convert WStringToString here
    std::string strIP = WStringToString(IP), strPort = WStringToString(Port);

    Incgetaddrinfo AddyResolver;
    addrinfo hints = {}, *pFinal = nullptr;

    hints.ai_family = AF_INET;

    //resolve the ip/port-combination for the connection process
    INT Ret = AddyResolver(strIP.c_str(), strPort.c_str(), &hints, &pFinal);
    if(Ret)
    {
        //error handling: throw an error description
        std::string ErrorString("Resolving Process failed (Connect): ");
        ErrorString.append(Inc::NumberToString<INT>(Ret));
        throw(std::runtime_error(ErrorString.c_str()));
    }


    /*---for debbuging---*/
    sockaddr_in *pP = (sockaddr_in*)(pFinal->ai_addr);
    u_short Porty = ntohs(pP->sin_port);
    char AddBuffer[20] = "";

    InetNtopA(AF_INET, (PVOID)&pP->sin_addr, AddBuffer, 20);
    /*--------------------------------------------------------*/


    if(connect(m_Socket, pFinal->ai_addr, pFinal->ai_addrlen) == SOCKET_ERROR)
    {
        int ErrorCode = WSAGetLastError();
        if((ErrorCode == WSAETIMEDOUT) || (ErrorCode == WSAEHOSTUNREACH) || (ErrorCode == WSAENETUNREACH))
        {
            //Just Unreachable
            return TCP_TARGETUNREACHABLE;
        }

        //real errors now
        std::string ErrorString("Connection Process failed: ");
        ErrorString.append(Inc::NumberToString<int>(ErrorCode));
        throw(std::runtime_error(ErrorString.c_str()));
    }

    return TCP_SUCCESS;
}

Zusätzliche Informationen:
-Incgetaddrinfo ist ein function-Objekt encapuslating getaddrinfo...
-Niemand von den server-Funktionen Rückgabe einer Fehlermeldung und funktioniert wie erwartet, wenn Sie Durchlaufen mit dem debugger oder, wenn man Sie führen allein...

Ich würde gerne Ihre Vorschläge hören, was das rpoblem sein könnte...

Edit: Es funktioniert, wenn ich dont verbinden ("localhost","12345"), aber zu ("",12345)...
Beim Blick in das address-resolution-Prozess der getaddrinfo es gibt 127.0.0.1 für "localhost" und meine echte IP - für ""

Warum geht es nicht mit meinem loopback-IP?

InformationsquelleAutor Incubbus | 2012-08-15

Schreibe einen Kommentar