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:
- Créer un Serveur de Socket -> Lier à Port 12345
- Mettre la Socket en mode d'écoute
- Appel accepter
Client
- Créer un socket -> Lier à un port aléatoire
- 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
Vous devez vous connecter pour publier un commentaire.
Vous avez la réponse dans votre question:
Cela signifie que votre serveur se lie à l'adresse IP réelle de l'interface au lieu de
INADDR_ANY
, c'est à dire qu'il n'écoute pas sur le bouclage.Modifier 0:
Vous n'avez pas vraiment besoin de résolution de nom lors de la création de socket d'écoute. Juste
bind()
àINADDR_ANY
à écouter sur toutes les interfaces disponibles (y compris le bouclage).netstat -na
montrera quels sont les ports écoutés sur les adresses. IIRC-b
option sur Windows va vous montrer quels programmes utiliser les connexions.ok... quand je lier à "" (INADDR_ANY en raison de AI_PASSIVE dans les notes de getaddrinfo), il se lie à l'192..... et est à l'écoute sur ip avec le port 12345 (netstat -na) =>essayez de vous connecter via "œuvres", mais localhost échoue... la liaison du socket serveur localhost fait écouter sur 127.0.0.1 (netstat) => connexion via "" échoue, et via localhost ne parvient pas trop...
Mec, avez-vous ou n'avez-vous pas "bind ()", "INADDR_ANY"? Si non, pourquoi pas???
"Dude", oui je l'ai fait - comme décrit ci-dessus - en passant une chaîne vide pour getaddrinfo et en utilisant le drapeau AI_PASSIVE (msdn.microsoft.com/en-us/library/ms738520(v=vs. 85) => vers le bas vers le Drapeau de table de Bits)
OriginalL'auteur Nikolai Fetissov