Надеюсь кто-нибудь поможет решить следующую проблему: мне необходимо
написать udp сервер, который может разбирать Ip, udp заголовки.
Я уже прочитал много литературы, исследовал утилиту ping из MSDN, но
к сожалению, пока не добился положительного результата.
Windows никак не хочет давать мне заголовок! Получаю только передаваемые
данные. Ниже привожу исходный текст, скорее всего там ошибка.
Буду признателен любой помощи, особенно за работающий кусок кода!
// Udp header
typedef struct udphdr {
unsigned short src_portno;
unsigned short dst_portno;
unsigned short udp_length;
unsigned short udp_checksum;
}UdpHeader;
// IP header
typedef struct iphdr {
unsigned int h_len; // length of the header
unsigned int version; // Version of IP
unsigned char tos; // Type of service
unsigned short total_len; // total length of the packet
unsigned short ident; // unique identifier
unsigned short frag_and_flags; // flags
unsigned char ttl;
unsigned char proto; // protocol (TCP, UDP etc)
unsigned short checksum; // IP checksum
unsigned int sourceIP;
unsigned int destIP;
}IpHeader;
char src[10];
char dest[10];
char ds[15];
#define MAX_PACKET 1024
#define PORT 666 // порт сервера
char Buffer[1024];
int main(int argc, char* argv[])
{
WSADATA wsadata;
printf("UDP Server\n");
// шаг 1 — подключение библиотеки
//&wsadata
if (WSAStartup(0x202,&wsadata))
{
printf("WSAStartup error: %d\n",
WSAGetLastError());
return -1;
}
SOCKET my_sock;
// создание сокета
my_sock= socket(AF_INET,SOCK_RAW,IPPROTO_UDP);
if (my_sock==INVALID_SOCKET)
{
printf("Socket() error: %d\n",WSAGetLastError());
WSACleanup();
return -1;
}
Не вдавался в подробности, но не увидел вызова
BOOL flag = TRUE;
setsockopt(my_sock, IP_PROTOIP, IP_HDRINCL, (char *)&flag, sizeof(flag));
Эта опция разрешает возвращать данные с заголовком. Сделай вызов перед тем как
вызвать bind() или recv() — должна помочь.
Алексей
Здравствуйте, prometey, Вы писали:
P>Windows никак не хочет давать мне заголовок! Получаю только передаваемые P>данные. Ниже привожу исходный текст, скорее всего там ошибка.
P> my_sock= socket(AF_INET,SOCK_RAW,IPPROTO_UDP);
Вы писали 18 февраля 2004 г., 22:51:35:
p> Спасибо всем кто откликнулся! Вообще-то я уже устанавливал p> setsockopt(my_sock, IPPROTO_IP, IP_HDRINCL, (char *)&flag, sizeof(flag));
хм.. действительно, видимо это действует только на посылку..
тогда только остаётся WSAIoctl ( .. SIO_RCVALL .. ) и выбирать
нужные тебе пакеты..
Если найдёшь способ без SIO_RCVALL, запости сюда, я тоже ещё поищу..
Здравствуйте, prometey, Вы писали:
P>Всем привет!
P>Надеюсь кто-нибудь поможет решить следующую проблему: мне необходимо P>написать udp сервер, который может разбирать Ip, udp заголовки. P>Я уже прочитал много литературы, исследовал утилиту ping из MSDN, но P>к сожалению, пока не добился положительного результата.
Мое мнение — человеку не хватает WinPcap.
Re[2]: Разобрать ip пакет
От:
Аноним
Дата:
21.02.04 17:48
Оценка:
Здравствуйте!
Большое спасибо eax за код!!!! Только появилась новая проблема: я отсылаю Ip пакет(протокол udp), но Ваша программа считает, что передается icmp пакет и показывает какую-то ерунду. Я также скомпилил программу из статьи на rsdn "сниффер — шит и меч" и она
показывает тоже самое, но ведь абсолютно точно передается udp пакет!!!! Я протестировал это на
windows 2000 professional и windows xp professional и везде одно и тоже! Мне очень интересно в чём же проблема?