} FILE *file;
/* 以读写的方式建立一个文本文件logfile.txt */ if((file=fopen(argv[1],\ printf(\ return -1; }
WSAData wsData;
/* 启动2.2版本的Socket,并将Socket版本信息保存到wsData中 */ if(WSAStartup(MAKEWORD(2,2),&wsData)!=0){ printf(\ return -1; }
fprintf(file,\初始化...\\r\\n\
fprintf(file,\ fprintf(file,\描述:%s\\r\\n\ fprintf(file,\状态:%s\\r\\n\
fprintf(file,\ SOCKET sock; /* 创建原始套接字 */
if((sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP))==INVALID_SOCKET){
printf(\
return -1; }
BOOL flag=true; /* 设置IP头操作选项 */
if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(CHAR*)&flag,sizeof(flag))==SOCKET_ERROR){
printf(\ return -1; }
char hostName[128]; /* 获取本地主机名 */
if(gethostname(hostName,100)==SOCKET_ERROR){ printf(\ return -1; }
hostent *pHostIP;
/* 根据主机名获取主机信息 */
if((pHostIP=gethostbyname(hostName))==NULL){ printf(\ return -1; }
printf(\
printf(\
/* 封装IP地址信息 */ sockaddr_in addr_in;
addr_in.sin_addr=*(in_addr*)pHostIP->h_addr_list[0]; addr_in.sin_family=AF_INET;
addr_in.sin_port=htons(6000); //监听的端口号 /* 把Socket绑定到本地网卡 */
if(bind(sock,(PSOCKADDR)&addr_in,sizeof(addr_in))==SOCKET_ERROR){
printf(\ return -1; }
DWORD dwBufferLen[10]; DWORD dwBufferInLen=1; DWORD dwBytesReturned=0; /* 设置网卡为混杂模式 */
if(WSAIoctl(sock,IO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen),
&dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL)==SOCKET_ERROR){
printf(\ return -1; }
char buffer[BUFFER_SIZE];
printf(\开始解析=============\\r\\n\ while(true){
/* 从套接字接收IP数据报 */
int size=recv(sock,buffer,BUFFER_SIZE,0); if(size>0){
ipparse(stdout,buffer); ipparse(file,buffer); } }
/* 解除Socket绑定 */
if(WSACleanup()==SOCKET_ERROR){ printf(\ return -1; }
/* 关闭文件 */ fclose(file); return 0; }
四、测试数据及其结果分析 1、在“运行”中输入cmd命令:
2、截获IP数据包程序运行结果如下: