代码如下:
#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;
}不知道为什么源地址和目的地址总是一样的
#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;
}不知道为什么源地址和目的地址总是一样的
http://bbs.51cto.com/archiver/tid-9148.html