资源简介
RAW模式的SOCKET编程 PING程序是面向用户的应用程序,该程序使用ICMP的封装机制,通过IP协议来工作。为了实现直接对IP和ICMP包进行操作,实验中使用RAW模式的SOCKET编程。熟悉SOCKET的编程,包括基本的系统调用如SOCKET、BIND等; 2、具体内容 1) 定义数据结构需要定义好IP数据报、ICMP包等相关的数据结构; 2) 程序实现在WINDOWS环境下实现PING程序; 3) 程序要求在命令提示符下输入: PING ΧΧΧ.ΧΧΧ.ΧΧΧ.ΧΧΧ 其中ΧΧΧ为目的主机的IP地址,不要求支持域名,对是否带有开关变量也不做要求。不带开关变量时,要求返回4次响应。返回
代码片段和文件信息
// ping.cpp : 定义控制台应用程序的入口点。
#include
#include
#include
#define SEND_SIZE 32
#define PACKET_SIZE 4096
#define ICMP_ECHO 8
#define ICMP_ECHOREPLY 0
#pragma comment(lib“Ws2_32.lib“)
struct icmp
{
unsigned char icmp_type; //类型
unsigned char icmp_code; //编码
unsigned short icmp_chksum; //校验和
unsigned short icmp_id; //标示符
unsigned short icmp_seq; //顺序号
unsigned long icmp_data; //数据
};
struct ip
{
unsigned char ip_hl:4; //报头长度
unsigned char ip_v:4; //版本号
unsigned char ip_tos; //服务类型
unsigned short ip_len; //总长度
unsigned short ip_id; //标识
unsigned short ip_off; //标志
unsigned char ip_ttl; //生存时间
unsigned char ip_p; //协议号
unsigned short ip_sum; //报头校验和
unsigned long ip_src; //源IP地址
unsigned long ip_dst; //目的IP地址
};
char sendpacket[PACKET_SIZE];
char recvpacket[PACKET_SIZE];
struct sockaddr_in dest_addr;
struct sockaddr_in from_addr;
int sockfd;
int pid;
unsigned short cal_chksum(unsigned short *addrint len);
int pack(int pack_no);
int unpack(unsigned char *bufint len);
void send_packet(void);
void recv_packet(void);
int main(int argc CHAR* argv[])
{
struct hostent *host;
struct protoent *protocol;
int timeout=1000;
int SEND_COUNT=4;
int i;
char *par_host;
char m_Input[100];
printf(“Input IP: “);
gets(m_Input);
par_host=m_Input;
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2 2 );
err = WSAStartup( wVersionRequested &wsaData );
if ( err != 0 ) return;
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) {
WSACleanup( );
return;
}
if( (protocol=getprotobyname(“icmp“) )==NULL) //返回对应于给定协议名的包含名字和协议号
{
printf(“getprotobyname error\n“); //的protoent结构指针
exit(1);
}
if( (sockfd=socket(AF_INETSOCK_RAWprotocol->p_proto) )<0)
{
printf(“socket error\n“);
exit(1);
}
if(setsockopt(sockfdSOL_SOCKETSO_RCVTIMEO(char*)&timeoutsizeof(timeout))<0) //设置套接口的选项
fprintf(stderr“failed to set recv timeout: %d\n“WSAGetLastError());
if(setsockopt(sockfdSOL_SOCKETSO_SNDTIMEO(char*)&timeoutsizeof(timeout))<0)
fprintf(stderr“failed to set send timeout: %d\n“WSAGetLastError());
memset(&dest_addr0sizeof(dest_addr));
dest_addr.sin_family=AF_INET;
if(host=gethostbyname(par_host) ) // 返回对应于给定主机名的主机信息
{
memcpy( (char *)&dest_addr.sin_addrhost->h_addrhost->h_length);
//resolve address to hostname
if(host=gethostbyaddr(host->h_addr4PF_INET))
par_host=host->h_name;
}
else if( dest_addr.sin_addr.s_addr=inet_addr(par_host)==INADDR_NONE)
{
printf(“Unkown host %s\n“par
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 196695 2009-12-30 10:51 Ping\Debug\Ping.exe
文件 209128 2009-12-30 10:51 Ping\Debug\Ping.ilk
文件 21349 2009-12-30 10:51 Ping\Debug\Ping.obj
文件 3644536 2009-12-30 10:51 Ping\Debug\Ping.pch
文件 377856 2009-12-30 10:51 Ping\Debug\Ping.pdb
文件 148480 2009-12-30 10:51 Ping\Debug\vc60.idb
文件 77824 2009-12-30 10:51 Ping\Debug\vc60.pdb
文件 5627 2009-12-30 10:51 Ping\Ping.cpp
文件 3377 2009-12-30 10:51 Ping\Ping.dsp
文件 516 2009-12-30 10:51 Ping\Ping.dsw
文件 33792 2009-12-30 10:51 Ping\Ping.ncb
文件 48640 2009-12-30 10:51 Ping\Ping.opt
文件 736 2009-12-30 10:51 Ping\Ping.plg
文件 275968 2009-12-31 20:25 Ping\报告.doc
目录 0 2009-12-30 10:51 Ping\Debug
目录 0 2009-12-31 20:33 Ping
----------- --------- ---------- ----- ----
5044524 16
相关资源
- Qt制作的记事本软件
- pthreads-w32-2.9.1-release.zip
- 武汉大学数字图像处理期末实习代码
- 一卡通乘车系统
-
Pla
yer.zip - TFIDF算法实现
- 算法训练营题目合集-已转档.pdf
- 独立任务最优调度问题+算法设计
- funcode——黄金矿工
- 图书馆管理系统程序+全套开发文档系
- windows 程序设计 高清版
- SVM分类算法代码及实验报告
- vc做的小游戏 —— 彩色泡泡
- 五子棋算法比较强悍
- md3loader,导入md3模型源程序
- ARIMA 预测软件
- modbus上位机测试源码
- TradeX.dll 演示程序
- 人事考勤管理系统
- Canny算子源代码
- VS2017+OpenGL配置所需文件.rar
- ftp源码
- Naked Statistics Stripping the Dread From the
- Givens矩阵分解
- D3D11 Cube Mapping程序
-
Qt以tableWidget/tableView读取xm
l文件,并 - 游戏:猫狗大作战
- linux+QT下基于RTP协议的实时视频传输客
- Enigma Virtual Box V7.30官方中文版
- Qt天气助手绘图、获取城市列表
评论
共有 条评论