代码如下:
#include <stdio.h>
#include <winsock2.h>
//#include <winsock.h>#pragma comment(lib,"Ws2_32.lib")
#define IO_RCVALL _WSAIOW(IOC_VENDOR,1)struct IPHeader
{
unsigned char version_headerLength;       //版本+首部长度
unsigned char typeOfService;              //区分服务
unsigned short totalLength;               //总长度
unsigned short identification;            //16位标识
unsigned short flag_fragmentOffset;       //3位标志位+13位片偏移
unsigned char timeTolive;                 //生存时间
unsigned char prottocal;                  //协议
unsigned short headerCheckSun;            //首部校验和
unsigned long sourceAdd;                  //源地址
unsigned long destAdd;                    //目的地址
};int main()
{
WORD wVersionRequested;
WSADATA wsDate;

wVersionRequested = MAKEWORD(2,2);
WSAStartup(wVersionRequested,&wsDate); //创建一个socket
SOCKET sock;
sock = WSASocket(AF_INET, SOCK_RAW, IPPROTO_IP, NULL, 0, WSA_FLAG_OVERLAPPED);

if(sock == INVALID_SOCKET)
{
printf("socket Error:%d.\n",WSAGetLastError()); 
WSACleanup();
return 1;
}

//获得主机ip
char hostName[128];
hostent *pHost;
sockaddr_in addr_in;
if(gethostname(hostName,sizeof(hostName)) == SOCKET_ERROR)
{
printf("gethostname is failed: %d",WSAGetLastError());
}

pHost = gethostbyname(hostName);
addr_in.sin_addr = *(IN_ADDR *)pHost -> h_addr_list[0];
addr_in.sin_family = AF_INET;
addr_in.sin_port = htons(50000);
printf("本机ip:%s\n",inet_ntoa(addr_in.sin_addr)); //讲地址与套接字绑定在一起
if(bind(sock,(sockaddr*)&addr_in,sizeof(addr_in)) == SOCKET_ERROR)
{
printf("bind is failed: %d",WSAGetLastError());
}

//设置网卡为混杂模式
unsigned long pBufferLen[10];
unsigned long dwBufferInLen = 1;
unsigned long dwBytesReturned = 0; WSAIoctl(sock,IO_RCVALL,&dwBufferInLen, sizeof(dwBufferInLen), &pBufferLen,sizeof(pBufferLen),&dwBytesReturned, NULL, NULL); const int BUFFER_SIZE = 1024;
char recvBuf[BUFFER_SIZE]; IPHeader *ipHeader;
printf("Waiting for IP packet...\n"); while(true)
{
int ret = recv(sock,recvBuf,BUFFER_SIZE,0);
if(ret > 0)
{
ipHeader = (IPHeader *)recvBuf;
} if(ipHeader -> destAdd == addr_in.sin_addr.S_un.S_addr || ipHeader -> sourceAdd == addr_in.sin_addr.S_un.S_addr)
{
printf("源地址\t\t目的地址\t\t协议类型\n");
printf("%s\t%s\t\t%d\t\n",inet_ntoa(*(IN_ADDR *)&(ipHeader -> sourceAdd)),
inet_ntoa(*(IN_ADDR *)&(ipHeader -> destAdd)),ipHeader -> prottocal);
}
}



return 0;
}不知道为什么源地址和目的地址总是一样的