在看一本安全编程书的时候读到原始套接字地方,自己也尝试写了下来,将遇到的一个问题发出来。
// 原始套接字数据的接收.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "stdio.h"
#include "Winsock2.h"
#include
#include "mstcpip.h"
#pragma comment(lib,"ws2_32.lib")
typedef struct IpHeader
{
unsigned char Version_HLen; //首部长度和IP版本号
unsigned char TOS; //服务类型TOS
unsigned short Length; //总长度
unsigned short Ident; //标识
unsigned short Flags_Offset; //标志位
unsigned char TTL; //生存时间TTL
unsigned char Protocol; //协议
unsigned short Checksum; //IP首部校验和
unsigned int SourceAddr; //源IP地址
unsigned int DestinationAddr; //目的IP地址
}Ip_Header;
int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsaData;
Ip_Header *ip;
//int Timeout=1000; //设置超时
SOCKET ReceiveSocket; //接收数据包的套接字
char RecvBuffer[1024]; //用于接收数据
sockaddr_in addr; //地址结构
int Len=sizeof(addr);
int Result;
if(Result=WSAStartup(MAKEWORD(2,2),&wsaData))
{
printf("WSAStartup failed with error %d\n",Result);
return 0;
}
ReceiveSocket=socket(AF_INET,SOCK_RAW,IPPROTO_IP);
if(ReceiveSocket==INVALID_SOCKET)
{
printf("socket failed with error %d\n",WSAGetLastError());
return 0;
}
char Name[255];
Result=gethostname(Name,255);//获取本机IP地址
if(Result==SOCKET_ERROR)
{
printf("gethostname failed with error %d\n",WSAGetLastError());
return 0;
}
struct hostent *pHostent;
pHostent=(struct hostent*)malloc(sizeof (struct hostent));
pHostent=gethostbyname(Name);
SOCKADDR_IN sock;
sock.sin_family=AF_INET;
sock.sin_port=htons(5555);
memcpy(&sock.sin_addr.S_un.S_addr,pHostent->h_addr_list[0],pHostent->h_length);
Result=bind(ReceiveSocket,(PSOCKADDR)&sock,sizeof(sock));
if(Result==SOCKET_ERROR)
{
printf("bind ReceiveSocket failed with error %d\n",WSAGetLastError());
closesocket(ReceiveSocket);
return 0;
}
DWORD dwBufferLen[10];
DWORD dwBufferInLen=1;
DWORD dwBytesReturned=0;
Result=WSAIoctl(ReceiveSocket,SIO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen),&dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL);
if(Result==SOCKET_ERROR)
{
printf("WSAIoctl failed with error %d\n",WSAGetLastError());
return 0;
}
while(1) //循环接收数据
{
memset(RecvBuffer,0,sizeof(RecvBuffer)); //接收数据缓冲区清零
memset(&addr,0,sizeof(addr));//对地址结构清零
Result=recvfrom(ReceiveSocket,RecvBuffer,1024,0,(sockaddr*)&addr,&Len);
if(Result==SOCKET_ERROR)
{
printf("recvfrom failed with error %d\n",WSAGetLastError());
return 0;
}
static int number=0; //接收的网络数据包的个数
number++;
printf("Packet Number:%d\n",number);
ip=(Ip_Header*)RecvBuffer;
struct in_addr a;
a.s_addr=ip->SourceAddr; //数据包的源IP地址
printf("ip source ip:%s\n",inet_ntoa(a)); //整形IP地址转换成字符串形式
a.s_addr=ip->DestinationAddr;//数据包的目的IP地址
printf("ip Destination IP:%s\n",inet_ntoa(a));
printf("protocol:%d\n",ip->Protocol); //分析协议类型
}
if(closesocket(ReceiveSocket)==SOCKET_ERROR)
{
printf("closesocket failed with error %d\n",WSAGetLastError());
return 0;
}
if(WSACleanup()==SOCKET_ERROR)
{
printf("WSACleanup failed with error %d\n",WSAGetLastError());
return 0;
}
return 0;
}
#include "mstcpip.h" 这个 头文件要放在最后,因为他的定义是在前面文件中实现的,也是我这次遇到的问题,反复编译不通过,提示变量未定义,我就纳闷了,变量是头文件里面的怎么没定义,后来仔细看是头文件的顺序错了。