Показать сообщение отдельно

  #7  
Старый 24.12.2008, 17:56
criz
Постоянный
Регистрация: 04.11.2007
Сообщений: 303
Провел на форуме:
811764

Репутация: 119
По умолчанию

Вот, у меня этот вариант работает:
Код:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
#include <winsock.h>
#include <conio.h>

#define PROMISC        0x98000001
#define MAX     10000

#pragma comment(lib, "ws2_32.lib")

typedef struct{
	unsigned int version 	: 4;
	unsigned int h_len   	: 4;
	unsigned int tos     	: 8;
	unsigned int tot_len 	: 16;
	unsigned int ID      	: 16;
	unsigned int flags   	: 3;
	unsigned int f_offset	: 13;
	unsigned int TTL        : 8;
	unsigned int protocol   : 8;
	unsigned int h_checksum : 16;
	unsigned int srcip      : 32;
	unsigned int dstip      : 32;
}IPHEADER;

int main(void)
{
	SOCKADDR_IN      addr;
	WSADATA          wsd;
	SOCKET           mSocket;
	HOSTENT          *host;
	IPHEADER         *ip;
	unsigned long    mode = 1;
	int              len;
	char             pcname[32];
	char             buf[MAX];
        int x;


	/* load windows socket interface */
	if(WSAStartup(MAKEWORD(2,2),&wsd) != 0)
	{
		puts("Could not load winsocket api");
		exit(1);
	}

	/* Get computer name */
	len = sizeof(pcname) - 1;
	GetComputerNameA(pcname,&len);
	len = 0;

	/* Get host IP address by name */
	host = gethostbyname(pcname);

	/* Set addr & buf to 0 */
	memset(&addr,0,sizeof(addr));
	memset(buf,0,sizeof(buf));

	/* init. local address & create raw socket */
	addr.sin_addr.s_addr    = ((struct in_addr*)host->h_addr_list[0])->s_addr;
        addr.sin_family         = AF_INET;
	addr.sin_port           = htons(0);
	mSocket                 = socket(AF_INET,SOCK_RAW,IPPROTO_IP);

	if(mSocket == INVALID_SOCKET)
	{
		puts("Could not create a RAW socket");
		exit(1);
	}

	/* Bind socket with local address */
	if(bind(mSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR)) != -1)
	{
		/* Convert socket to SIO_RCVALL mode */
		if(ioctlsocket(mSocket,PROMISC,&mode) != 0)
		{
			puts("Could not convert socket to SIO_RCVALL mode");
                        printf("Error: %d\n", GetLastError());
		}

		/*-----------------------------------------------*/
		x = 1;
		while(!kbhit())
		{
			len = recv(mSocket,buf,sizeof(buf),0);

			/* Check received data */
			if(len >= sizeof(IPHEADER))
			{
				ip = (IPHEADER*)buf;
				printf("\n+--------- %d ------------+\n",x++);

				printf("| DEST    : %s\n",inet_ntoa(*((struct in_addr*)&ip->dstip)));
				printf("| SRC     : %s\n",inet_ntoa(*((struct in_addr*)&ip->srcip)));
				printf("| VERSION : %d\n",ip->version);

				printf("+------------------------+\n");

			}
		}
	}
	else
	{
		puts("Could not bind");
	}
        return 0;
}
Выделил то, что добавил сам.
З.Ы. тестировал на Builder'е, пришлось некоторые либы выкинуть
 
Ответить с цитированием