winsock: connexion échoue avec l'erreur 10049 lors de l'utilisation de localhost (127.0.0.1)

j'ai écrit une classe encapsulant certains winsock fonctions d'imiter un simple socket TCP pour mes besoins...

Lorsque j'essaie d'exécuter une simple connecter et d'envoyer des données vers les serveurs de test, le "client" échec lors de son appel à se connecter avec le code d'erreur d'10049 (WSAEADDRNOTAVAIL) fonction de connexion sur le site MSDN

Ce que je fais (code ci-dessous):
Serveur:

  1. Créer un Serveur de Socket -> Lier à Port 12345
  2. Mettre la Socket en mode d'écoute
  3. Appel accepter

Client

  1. Créer un socket -> Lier à un port aléatoire
  2. Appel Connect: se connecter à localhost, port 12345

=> l'appel à connect échoue avec l'Erreur 10049, comme décrit ci-dessus

Ici est la fonction principale, y compris le "serveur":

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 fonction

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;
}...

La Connectez-Fonction

    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;
}

Informations Supplémentaires:
-Incgetaddrinfo est un objet de fonction encapuslating getaddrinfo...
-Aucun des fonctions de serveur retourne aucune erreur et fonctionne comme prévu lorsque les passant en revue l'utilisation du débogueur ou lorsque les laisser courir seul...

Je serais heureux d'entendre vos suggestions que le rpoblem peut-être...

Edit: Il fonctionne quand je ne se connecter à ("localhost","12345"), mais à ("",12345)...
Quand on regarde dans la barre d'adresse du processus de résolution de getaddrinfo il donne 127.0.0.1 pour "localhost" et mon IP réelle pour ""

Pourquoi ne pas travailler avec mon bouclage-IP?

OriginalL'auteur Incubbus | 2012-08-15