Добавил:
korayakov
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
#include "stdafx.h"
#include <conio.h>
#include <stdio.h>
#include <winsock2.h>
#include <stdlib.h>
#pragma comment (lib,"ws2_32.lib")
#define cmd 0x98000001 // Command to perform on the socket s.
char Buffer[1024*64]; // Буфер для приема данных
char *HostIp(unsigned long int in); // норм. вид IP
// Структура заголовка IP-пакета
typedef struct IPHeader {
unsigned char hlength:4;//header length
unsigned char version:4;// версия длины заголовка
unsigned char tos; // тип сервиса
unsigned short length; // длина всего пакета
unsigned short id; // идентификация
unsigned short offset; // флаги и смещения
unsigned char ttl; // время жизни пакета
unsigned char protocol; // протокол
unsigned short xsum; // контрольная сумма
unsigned int saddr; // IP-адрес отправителя
unsigned int daddr; // IP-адрес назначения
} IPHeader;
// Структура заголовка UDP-пакета
typedef struct UDPHeader {
unsigned short source; // порт отправителя
unsigned short dest; // порт назначения
unsigned short len; // длина датаграммы
unsigned short xsum; // контрольная сумма
} UDPHeader;
// Структура заголовка TCP-пакета
typedef struct TCPHeader
{
unsigned short source; // source port
unsigned short dest; // destination port
unsigned int seq; // sequence number
unsigned int ack_seq; // acknowledge sequence number
unsigned int res1:4, // can't figure this one out
doff:4, // data offset
fin:1, // request to close connection
syn:1, // synchronization sequence numbers
rst:1, // Reset Connection
psh:1, // transmit without filling buffer
ack:1, // acknowledge field was valid
urg:1, // urgent/highpriority data
res2:2;
unsigned short window; // for Window Flow Control
unsigned short xsum; // CheckSum
unsigned short urg_ptr; // valid when urg flag is set
} TCPHeader;
void main()
{
WSADATA wsadata; // Инициализация WinSock.
SOCKET s; // Слушающий сокет.
SOCKADDR_IN sa; // Адрес хоста
unsigned long flag = 1;// Флаг
WSAStartup(MAKEWORD(2,2), &wsadata);
s = socket(AF_INET,SOCK_RAW,IPPROTO_IP);
sa.sin_family=AF_INET;
sa.sin_addr.s_addr=inet_addr("172.16.99.252");
bind(s,(SOCKADDR *)&sa,sizeof(SOCKADDR));
//Прослушиваем все порты
ioctlsocket(s,cmd,&flag);
//Бесконечный цикл приема IP-пакетов. До тех пор, пока не будет нажата любая кнопка.
while(!_kbhit())
{
int count;
count = recv(s,Buffer,sizeof(Buffer),0);
// Обработка IP-пакета
if(count >= sizeof(IPHeader))
{
IPHeader* IpHdr = (IPHeader *)Buffer;
UDPHeader* UdpHdr = (UDPHeader *)Buffer;
TCPHeader* TcpHdr = (TCPHeader *)Buffer;
printf("\n\nIpHeader: version=%d hlength=%d tos=%d length=%d id=%d "
"offset=%d ttl=%d\nprotocol=%d xsum=%d saddr=%lx "
"daddr=%lx\n",
IpHdr->version,
IpHdr->hlength,
IpHdr->tos,
ntohs(IpHdr->length),
ntohs(IpHdr->id),
ntohs(IpHdr->offset),
IpHdr->ttl,
IpHdr->protocol,
ntohs(IpHdr->xsum),
HostIp(IpHdr->saddr),
HostIp(IpHdr->daddr));
// Если это UDP-пакет, выводим UDP-информацию.
if(IpHdr->protocol==17)
{
printf("\nUDP: source=%d dest=%d len=%d xsum=%d\n",
ntohs(UdpHdr->source),ntohs(UdpHdr->dest),
ntohs(UdpHdr->len),ntohs(UdpHdr->xsum));
printf("s_host:%s s_port:%d\n",
HostIp(IpHdr->saddr),
ntohs(UdpHdr->source));
printf("d_host:%s d_port:%d\n",
HostIp(IpHdr->daddr),
ntohs(UdpHdr->dest));
printf("\n");
}
// Если это TCP-пакет, выводим TCP-информацию.
if(IpHdr->protocol==6)
{
printf("\nTCP: source=%d dest=%d seq=%lx "
"ack_seq=%lx doff=%d\n[flags] window=%d xsum=%d "
"urg_ptr=%d\n",
ntohs(TcpHdr->source),
ntohs(TcpHdr->dest),
ntohl(TcpHdr->seq),
ntohl(TcpHdr->ack_seq),
TcpHdr->doff,
ntohs(TcpHdr->window),
ntohs(TcpHdr->xsum),
ntohs(TcpHdr->urg_ptr));
printf("Flags: ");
if(TcpHdr->urg) printf("URG ");
if(TcpHdr->ack) printf("ACK ");
if(TcpHdr->psh) printf("PSH ");
if(TcpHdr->rst) printf("RST ");
if(TcpHdr->syn) printf("SYN ");
if(TcpHdr->fin) printf("FIN ");
printf("\n");
printf("s_host:%s s_port:%d\n",
HostIp(IpHdr->saddr),
ntohs(TcpHdr->source));
printf("d_host:%s d_port:%d\n",
HostIp(IpHdr->daddr),
ntohs(TcpHdr->dest));
}
}
}
closesocket(s);
WSACleanup();
}
// норм. вид IP
char *HostIp(unsigned long int in)
{
static char szHostName[512] = "";
struct in_addr iaddr;
memset(&iaddr,0,sizeof(iaddr));
iaddr.s_addr=in;
strcpy(szHostName,inet_ntoa(iaddr));
return (szHostName);
}