原始套接字,接收所有数据的设置方法,及代码。

在看一本安全编程书的时候读到原始套接字地方,自己也尝试写了下来,将遇到的一个问题发出来。

// 原始套接字数据的接收.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"   这个 头文件要放在最后,因为他的定义是在前面文件中实现的,也是我这次遇到的问题,反复编译不通过,提示变量未定义,我就纳闷了,变量是头文件里面的怎么没定义,后来仔细看是头文件的顺序错了。


你可能感兴趣的:(C/C++)