Bonjour,
Je commence les raw sockets en C++ par un sniffer, en regardant un code, j'ai à peu près compris comment ca fonctionne... Seulement, la réception d'un paquet renvoie l'erreur 10014...

Voici mon code :
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
 
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>
#include <winsock2.h>
#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
 
int main(void)
{
 WSADATA wsaData;
 WSAStartup(MAKEWORD(2,2), &wsaData);
 SOCKET socksniffer;
 struct hostent *hp;
 socksniffer = WSASocket(AF_INET, SOCK_RAW, IPPROTO_IP, NULL, 0, WSA_FLAG_OVERLAPPED);
 
 struct sockaddr_in dest,from;
 char Hostname[32], packet[2048];
 DWORD dwBufferLen[10],dwBufferInLen = 1,dwBytesReturned = 0,dwSize;
 
 int fromlen = sizeof(from);
 
 dwSize = 32 * sizeof(DWORD);
 GetComputerName(Hostname,&dwSize);
 cout << Hostname;
 
 hp = gethostbyname(Hostname);
 int i = 0;
 while((hp->h_addr_list[i+1]) != NULL) i++;
 
 memcpy(&from.sin_addr.s_addr, hp->h_addr_list[i], hp->h_length);
 
 hp = gethostbyname(inet_ntoa(from.sin_addr));
 
 memcpy(&dest.sin_addr.s_addr, hp->h_addr_list[0], hp->h_length);
 dest.sin_family = AF_INET;
 dest.sin_port = htons(8000);
 
 bind(socksniffer, (PSOCKADDR)&dest, sizeof(dest));
 
 WSAIoctl(socksniffer, SIO_RCVALL, &dwBufferInLen, sizeof(dwBufferInLen), &dwBufferLen, sizeof(dwBufferLen),&dwBytesReturned , NULL , NULL);
 
 int sread;
 for(int j=0;j<5;j++)
  {
   sread = recvfrom(socksniffer, packet, 8191, 0, (struct sockaddr*)&from, &fromlen);
   if(sread <0 || sread == SOCKET_ERROR) cout << WSAGetLastError();
   cout << packet << "\n\n\n";
  }
 
 
 system("pause");
 WSACleanup();
 return 0;
}
J'aimerais savoir pourquoi il renvoie l'erreur 10014 et éventuellement avoir des remarques sur l'optimisation de ce code...