[原创]C语言模拟Ping
最近在学习TCP/IP协议。在以前套接字基础上又学习了原始套接字的使用。并喜欢上了这个东西-因为它功能太强大了。
下面是我用原始套接字实现的Ping.exe命令
//Ping模拟 By RedIce
//E-mail:redice@see.xidian.
//http://redice.1.
#include //Winsock API头文件
#include
#include
#pragma comment(lib,"ws2_32.lib") //Winsock API连接库文件
/*IP头 结构*/
//BYTE<=>unsigned char,自定义类型
//USHORT<=>unsigned short,自定义类型
//UINT<=>unsigned int,自定义类型
//ULONG<=>unsigned long,自定义类型
typedef struct iphdr{
BYTE h_len:4; //首部长度指的是IP层头部占32 bit字的数目
//(也就是IP层头部包含多少个4字节,实际字节数4*hlen),
BYTE version:4; //IP版本号
BYTE tos; //服务类型TOS
USHORT total_len; //IP包总长度
USHORT ident; //标识
USHORT frag_and_flags; //标志位
BYTE ttl; //生存时间
BYTE proto; //协议
USHORT checksum; //IP首部校验和
UINT sourceIP; //源IP地址(32位)
UINT destIP; //目的IP地址(32位)
}IpHeader;
/*ICMP头 结构*/
typedef struct _ihdr{
BYTE i_type; //类型 发出的ICMP为8(ICMP_ECHO_REQUEST),接受到的ICMP为0
BYTE i_code; //代码
USHORT i_cksum; //ICMP包校验和
USHORT i_id; //识别号(一般用进程号作为标识号)
USHORT i_seq; //报文序列号(一般设置为0)
ULONG timestamp;//时间戳
}IcmpHeader;
USHORT checksum(USHORT *,int); //函数声明:计算ICMP包校验和
void usage();//函数声明:使用帮助
void main(int argc,char *argv[])
{
char *ICMP_DEST_IP;//目标主机IP
WSADATA wsaData;
struct sockaddr_in dest,from;//地址结构
int datasize; //ICMP报文大小
int ret;//API函数 返回值
int i;//循环计数器
int attachsize=32;//ICMP数据包附加字节数,本程序默认为32字节
int n=4;//发送数据包个数,本程序默认发送4个ICMP数据包
int timeout;