Socket client bloquée dans l'état SYN_SENT
Bonjour,
Je viens vous faire part d'un problème de socket.
C'est la première fois que j'utilise des sockets sous windows. J'ai donc un serveur (Projet WPF C++ sous visual studio 2017 Community) qui est en écoute sur le port 5555. Il est bien en écoute car lorsque je test une connexion depuis ma machine virtuelle Debian à l'aide de la commande :
Code:
echo "Bonjour" | nc 172.16.0.102 5555
Mon serveur reçoit bien la connexion et lit le message.
Le problème vient de mon application client. Cette dernière est développée en C++ sous Visual Studio 2017 Community. Lorsque le client est en phase de connexion et que j'observe les port TCP sur ma machine à l'aide de la commande suivante :
J'obtiens le résultat suivant pour mon application client :
Code:
TCP 172.16.0.102:51733 172.16.0.102:5555 SYN_SENT 10920
Après une recherche, j'apprends que lorsque la connexion est à l'état "SYN_SENT" (trop longtemps) c'est que cette dernière est bloquée par éventuellement le pare-feu. J'ai donc désactivé mon pare-feu mais j'ai toujours cet état. J'ai également tenté de faire la connexion sur l'adresse locale "127.0.0.1" mais j'ai le même résultat.
Voici le code du serveur qui initialise la socket serveur :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
|
Server::Server(int port)
{
//Indique qu'on utilise des sockets
WSAStartup(MAKEWORD(2, 2), &_WSAData);
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = 0;
hints.ai_flags = AI_PASSIVE;
// Resolve the local address and port to be used by the server
int gaiRes = getaddrinfo(NULL, "5555", &hints, &result);
if (gaiRes != 0)
{
WSACleanup();
}
//Creation de la socket
_socket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
if (_socket == INVALID_SOCKET)
{
freeaddrinfo(result);
WSACleanup();
}
// Setup the TCP listening socket
int bindResult = bind(_socket, result->ai_addr, (int)result->ai_addrlen);
if (bindResult == SOCKET_ERROR)
{
freeaddrinfo(result);
closesocket(_socket);
WSACleanup();
}
freeaddrinfo(result);
if (listen(_socket, SOMAXCONN) == SOCKET_ERROR)
{
closesocket(_socket);
WSACleanup();
}
}
SOCKET Server::Accept()
{
SOCKADDR_IN client_sin;
int cs_size = sizeof(client_sin);
SOCKET client;
if ((client = accept(_socket, NULL, NULL)) != INVALID_SOCKET)
{
return client;
}
else {
return -1;
}
} |
Et voici le code de la socket client :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
|
NetworkClient::NetworkClient(const char * address, const char * port)
{
int WSAResult = WSAStartup(MAKEWORD(2, 2), &WSAData);
if (WSAResult != 0)
{
printf("WSAStartup failed : %i\n", WSAResult);
}
Sresult = NULL;
ptr = NULL;
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = 0;
int getAddrInfoResult = getaddrinfo(address, port, &hints, &Sresult);
if (getAddrInfoResult != 0)
{
printf("getaddrinfo failed : %i\n", getAddrInfoResult);
WSACleanup();
}
ConnectSocket = INVALID_SOCKET;
ptr = Sresult;
ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol);
if (ConnectSocket == INVALID_SOCKET)
{
printf("Error at socket(): %ld\n", WSAGetLastError());
freeaddrinfo(Sresult);
WSACleanup();
//return 1;
}
}
void NetworkClient::Connect()
{
//Connect to server
int connectResult = connect(ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen);
if (connectResult == SOCKET_ERROR)
{
printf("Connect failed : %i\n", connectResult);
closesocket(ConnectSocket);
ConnectSocket = INVALID_SOCKET;
}
freeaddrinfo(Sresult);
if (ConnectSocket == INVALID_SOCKET)
{
printf("Unable to connect to server!\n");
WSACleanup();
}
} |
Les paramètres passés au constructeur sont "127.0.0.1" et "5555".
Le client bloque dans la méthode Connect() lors de l'appel de la fonction connect().
J'ai l'impression que Windows bloque la connexion sur ma boucle locale.
Si vous avez une idée pour résoudre ce problème je suis preneur.
Merci d'avance.