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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
 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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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.