Всем привет!
Надеюсь кто-нибудь поможет решить следующую проблему: мне необходимо
написать udp сервер, который может разбирать Ip, udp заголовки.
Я уже прочитал много литературы, исследовал утилиту ping из MSDN, но
к сожалению, пока не добился положительного результата.
Windows никак не хочет давать мне заголовок! Получаю только передаваемые
данные. Ниже привожу исходный текст, скорее всего там ошибка.
Буду признателен любой помощи, особенно за работающий кусок кода!
#include "stdafx.h"
#include "stdio.h"
#include "string.h"
#include "winsock2.h"
#include "windows.h"
#include "stdlib.h"
#define IP_HDRINCL 2
// 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;
}
// шаг 3 — связывание сокета с локальным адресом
sockaddr_in local_addr;
local_addr.sin_family=AF_INET;
local_addr.sin_addr.s_addr=INADDR_ANY;
local_addr.sin_port=htons(PORT);
if (bind(my_sock,(sockaddr *) &local_addr,
sizeof(local_addr)))
{ printf("bind error: %d\n",WSAGetLastError());
closesocket(my_sock);
WSACleanup();
return -1;
}
// Обработка
while(1)
{
sockaddr_in client_addr;
int client_addr_size = sizeof(client_addr);
int bsize=recvfrom(my_sock,Buffer,
MAX_PACKET,0,
(sockaddr *) &client_addr, &client_addr_size);
if (bsize==SOCKET_ERROR)
printf("recvfrom() error: %d\n",
WSAGetLastError());
// попытка прочитать Ip заголовок
IpHeader *iphdr = (IpHeader *)Buffer;
IN_ADDR sa1;
printf("From ");
sa1.s_addr = iphdr->destIP; // пытаюсь определить destination adress
printf(inet_ntoa(sa1));
// попытка определить тип протокола
if(iphdr->proto == IPPROTO_TCP) printf("TCP ");
if(iphdr->proto == IPPROTO_UDP) printf("UDP ");
// Определяем IP-адрес клиента и прочие атрибуты(но уже другим способом)
HOSTENT *hst;
hst=gethostbyaddr((char *)
&client_addr.sin_addr,4,AF_INET);
printf("+%s [%s:%d] new DATAGRAM!\n",
(hst)?hst->h_name:"Unknown host",
inet_ntoa(client_addr.sin_addr),
ntohs(client_addr.sin_port));
printf("From ");
// добавление завершающего нуля
Buffer[bsize]=0;
// Вывод на экран
printf("C=>S:%s\n",Buffer);
// посылка датаграммы клиенту
sendto(my_sock,&Buffer[0],bsize,0,
(sockaddr *)&client_addr, sizeof(client_addr));
}
return 0;
}
С уважением, Алексей.
18.02.04 13:18: Перенесено из 'Работа'