приветствую! задача собственно следующая: нужно поймать содержимое всех udp пакетов от определённого порта. как отфильтровать пакеты от других, получить длину, назначение и тд я знаю... а вот как посмотреть содержимое? заранее спасибо за ответы. Хорошо было бы если бы объяснили на примере. вот пока что у меня есть: Код (Text): #include <stdio.h> #include <winsock2.h> #pragma comment(lib, "WS2_32.lib") #define MAX_PACKET_SIZE 0x10000 #define SIO_RCVALL 0x98000001 char Buffer[MAX_PACKET_SIZE]; typedef struct IPHeader { UCHAR iph_verlen; UCHAR iph_tos; USHORT iph_length; USHORT iph_id; USHORT iph_offset; UCHAR iph_ttl; UCHAR iph_protocol; USHORT iph_xsum; ULONG iph_src; ULONG iph_dest; } IPHeader; char src[10]; char dest[10]; char ds[15]; unsigned short lowbyte; unsigned short hibyte; void main() { WSADATA wsadata; SOCKET s; char name[128]; HOSTENT* phe; SOCKADDR_IN sa; IN_ADDR sa1; unsigned long flag = 1; WSAStartup(MAKEWORD(2,2), &wsadata); s = socket( AF_INET, SOCK_RAW, IPPROTO_IP ); gethostname(name, sizeof(name)); phe = gethostbyname( name ); ZeroMemory( &sa, sizeof(sa) ); sa.sin_family = AF_INET; sa.sin_addr.s_addr = ((struct in_addr *)phe->h_addr_list[0])->s_addr; bind(s, (SOCKADDR *)&sa, sizeof(SOCKADDR)); ioctlsocket(s, SIO_RCVALL, &flag); bool wrk = true; while(wrk) { int count; count = recv( s, Buffer, sizeof(Buffer), 0 ); if( count >= sizeof(IPHeader) ) { IPHeader* hdr = (IPHeader *)Buffer; if(hdr->iph_protocol == IPPROTO_UDP) { strcpy(src,"Пакет: "); CharToOem(src,dest); printf(dest); printf("From "); sa1.s_addr = hdr->iph_src; printf(inet_ntoa(sa1)); printf(" To "); sa1.s_addr = hdr->iph_dest; printf(inet_ntoa(sa1)); printf(" Prot: "); printf("UDP "); printf("Size: "); lowbyte = hdr->iph_length>>8; hibyte = hdr->iph_length<<8; hibyte = hibyte + lowbyte; printf("%u",hibyte); printf(" TTL:%u",hdr->iph_ttl); printf("\n"); } } } closesocket( s ); WSACleanup(); }
В этой строке получаете значение тоже count = recv( s, Buffer, sizeof(Buffer), 0 ); Смотрите по какому смещению находятся данные в протоколе. ip-udp. ip насколько я помню 20 байт, сколько-то хидер udp. Для этого уже есть структуры описывающие upd.
Некогда искать, смысл прост. Пакет является такой штукой: ip хидер + udp хидер + data. Размер ip постояннный: 20 байт. Разме udp хидера struct udpheader { unsigned short int uh_sport; unsigned short int uh_dport; unsigned short int uh_len; unsigned short int uh_check; }; /* total udp header length: 8 bytes (=64 bits) */ после этого идут данные udp/ В ip содержится длина пакета вместе с ip хидером. Берете размер пакета в ip вычитаете из него размер ip header и размер udp хидера, и получаете смещение на данные юдп. А также вычитанием ip.length - смещение на данные = размер данных. Все эти значения можно получать разными способами, можно использовать и поле len в пакете udp. Прочитайте внимательно протокол ip, он не большой и там все нормально расписано и юдп протокол. Они достаточно простые, вот tcp намного сложнее и хитрее. Если поймете, то структуры уже сами можете создавать какие хотите.