Bon voici le problème :
J'essaye d'envoyer des paquets http avec winsock2 et, certains paquets sont envoyés, d'autres pas ... Je comprends pas pourquoi.
Voici le code :
Le paquets envoyé dépend donc de la chaine payload. Pour vérifier ce qui se passe, j'écoute le traffic avec wireshark.
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 #include <windows.h> #include <stdio.h> #include <stdlib.h> char buffer[128]; char *payload = "POST /"; int main() { WSADATA wsaData; WORD version; int error; version = MAKEWORD( 2, 0 ); error = WSAStartup( version, &wsaData ); if ( error != 0 ) { printf("Initialization failure : %d\n", error); return 1; } SOCKET client; client = socket( AF_INET, SOCK_STREAM, 0 ); hostent *host; host = gethostbyname( "google.com" ); struct sockaddr_in sin; memset( &sin, 0, sizeof sin ); sin.sin_family = AF_INET; sin.sin_addr.s_addr = ((struct in_addr *)(host->h_addr))->s_addr; sin.sin_port = htons(80); if ( connect( client, (sockaddr*)&sin, sizeof sin ) == SOCKET_ERROR ) { printf("Connection failed\n"); return 2; } printf("sending : %s\n", payload); if(send(client, payload, strlen(payload), 0) == SOCKET_ERROR) { printf("Error : %d", WSAGetLastError()); return 3; } recv(client, buffer, 4096, 0); printf(buffer); closesocket(client); WSACleanup(); return 0; }
Si payload = "GET /", tout est normale : le paquet est envoyé et le serveur me répond. (voir fichier correct.pcap).
Si payload = "GET / HTTP/1.1" ou "POST /" (j'ai juste essayé avec ceux là) : il y a une connection qui se crée mais aucun paquets n'est envoyé, puis l'application attends une réponse avec recv() (vérifié avec le déboggueur) mais qui évidemment ne vient jamais (voir incorrect.pcap).
Et c'est ça que je comprends pas : pourquoi est-ce que selon les données envoyée le paquets est envoyé ou pas ? Je tourne sous windows 7 64 bit
EDIT :
J'ai modifié une partie du code comme suis pour afficher le nombre d'octets envoyés :
Et ça m'affiche bien le nombre d'octet qui aurait dû être envoyé (14 et 6) mais pour wireshark il y a toujours rien d'envoyé et le serveur me répond pas ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 error = send(client, payload, strlen(payload), 0); if(error == SOCKET_ERROR) { printf("Error : %d", WSAGetLastError()); return 3; } printf("Bytes sent : %d\n", error);
note : j'ai aussi essayé en désactivant le pare-feu windows
Partager