根据使用的场合的不同,我们可以使用TCP、UDP和原始套接字来实现这个功能,今天就说一下基于基于原始套接字的回射客户端源代码。跟前面提过的工程一样,这个工程里面也包含着SocketFrame.cpp和SocketFrame.h这两个文件,所以就在之前的基础上添加使用原始套接字的回射客户端的功能文件就可以了。该功能源代码如下:
// EchoUDPClientRaw.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "winsock2.h"
#include "ws2tcpip.h"
#include "stdio.h"
#include "SocketFrame.h"
#pragma pack(push,1)
#define MAXLINE 200 // 发送和接收缓冲区的长度
#define INPUTLINE 100 // 输入文本的长度
#define ECHOPORT 7210//回射服务器的端口号
/********************************************************
函数名:UDP_MakeProbePkt
输入参数:char *pUDPData:待填充的缓冲区指针,应填充包括IP首部在内的数据
char *pInputData:存储用户输入的字符串
UINT uSrcIP:源IP地址
UINT uDstIP:目的IP地址
USHORT uSrcPort:源端口号
USHORT uDestPort:目的端口号
输出参数:构造后的缓冲区有效字节长度。
功能:构造UDP协议的回射报文
*********************************************************/
int UDP_MakeProbePkt(char *pUDPData, char *pInputData, UINT uSrcIP, UINT uDestIP, USHORT uSrcPort, USHORT uDestPort)
{
IPHDR *IPhdr; //基本IP头定义
UDPHDR *UDPhdr; //UDP头定义
FHDR Fhdr; //伪头
char buf[MAXLINE]; //数据缓冲
char *data;
int iRet=0;
char *lpbuf = buf;
CSocketFrame frame;
/设置IP头
ZeroMemory(buf,sizeof(buf));
IPhdr