www.pudn.com > sniffer.rar > TCPIP.cpp


//北京邮电大学电信工程学院大三学生antique制作 
#include  
#include "Winsock2.h" 
#include "ws2tcpip.h" 
#include 
#pragma comment(lib,"ws2_32.lib") 
#define SIO_RCVALL            _WSAIOW(IOC_VENDOR,1) 
void decode_ip(unsigned char *); 
int main(int argc, char* argv[]) 
{ 
	//初始化SOCKET,类似声明版本 
	WSADATA wsaData; 
	int iErrorCode = WSAStartup(MAKEWORD(2, 2), &wsaData); 
	if (iErrorCode != NO_ERROR) 
		printf("Error at WSAStartup()\n"); 
 
	//创建套接字,soket_raw 
	SOCKET SockRaw = socket(AF_INET, SOCK_RAW, IPPROTO_IP); 
	if (SockRaw == INVALID_SOCKET)  
	{ 
		printf("Error at socket(): %ld\n", WSAGetLastError()); 
		WSACleanup(); 
		return 0; 
	} 
 
 
	//获取本机IP地址 
	char HostName[200]; 
	if(SOCKET_ERROR==gethostname((char*)HostName,sizeof(HostName)-1)) 
	{ 
		printf("无法获取主机名!\n"); 
		return 0; 
	} 
 
	hostent* hp; 
	if((hp=gethostbyname((char*)HostName))==NULL)  
	{ 
		printf("无法获取主机信息!\n"); 
		return 0; 
	} 
	 
 
	//绑定端口,把hostname与sa绑定,sa与socketrow绑定 
	SOCKADDR_IN sa; 
	memcpy(&sa.sin_addr.S_un.S_addr,hp->h_addr_list[0],hp->h_length); 
	sa.sin_family=AF_INET; 
	sa.sin_port=htons(8888); 
	if(bind(SockRaw,(PSOCKADDR)&sa,sizeof(sa))==SOCKET_ERROR) 
	{ 
		printf("监听端口绑定失败!\n"); 
		return 0; 
	}; 
 
 
	//设置RAW socket 
	DWORD	OutBuf[10]; 
	DWORD	InBufSize = 1; 
	DWORD	RecvCount = 0; 
	if(SOCKET_ERROR==WSAIoctl(SockRaw,SIO_RCVALL,&InBufSize,sizeof(InBufSize),&OutBuf,sizeof(OutBuf),&RecvCount,NULL,NULL)) 
	{ 
		printf("设置socket失败!\n"); 
		return 0;//// 
	} 
 
	//侦听IP报文 
	char RecvBuf[1500]={0}; 
 
	unsigned char *a=(unsigned char *)&RecvBuf; 
	int i=1; 
		int  iRecvCount; 
	while (1) 
	{ 
		memset(RecvBuf, 0, sizeof(RecvBuf)); 
		if(iRecvCount = recv(SockRaw, RecvBuf, sizeof(RecvBuf), 0)>0) 
		{ 
			//收到数据包,解码 
			 	printf("%d ",i); 
				decode_ip(a); 
				i++; 
		} 
 
	} 
	return 1; 
}