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 :
Mon serveur reçoit bien la connexion et lit le message.
Code : Sélectionner tout - Visualiser dans une fenêtre à part echo "Bonjour" | nc 172.16.0.102 5555
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 netstat -ano
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part TCP 172.16.0.102:51733 172.16.0.102:5555 SYN_SENT 10920
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 :
Les paramètres passés au constructeur sont "127.0.0.1" et "5555".
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(); } }
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.
Partager