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; }