Chinaunix首页 | 论坛 | 博客
  • 博客访问: 42817
  • 博文数量: 31
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 330
  • 用 户 组: 普通用户
  • 注册时间: 2015-07-28 17:39
文章分类
文章存档

2015年(31)

我的朋友

分类: C/C++

2015-11-07 18:12:19

icmp:差错和控制信息的传输及某些网络信息的获取,允许路由器或主机报告差错情况和提供有关的异常报告。

看看ping程序:

1.套接字:
struct protoent * protocol;
protocol = getprotobyname("icmp");
int sockfd = socket(AF_INET, SOCK_RAW, protocol->p_proto)

2.设置超时限制:
int timeout = 1000;
setsockopt(png.sockfd, SOL_SOCKET, SO_RCVTIMEO, (char *) & timeout, sizeof(timeout));

3.目的ip地址的获取:
struct hostent * host;
char *par_host; //主机名
struct sockaddr_in dest_addr;

host = gethostbyname(par_host);
memcpy((char *)&dest_addr.sin_addr, host->h_addr, host->h_length);

将ip地址存放在结构dest_addr中。

4.发送icmp包包含内容:
icmp_type = ICMP_ECHO; //询问报文,
cmp_code = 0; //echo回送请求
icmp_cksum = 0; //
icmp_seq = pack_no; //序号
icmp_id = png.pid; //标志,进程的id
icmp->icmp_data= GetTickCount(); //发送的数据,注意设置的数据长度。

整个报文的检验和:
按16位反码相加,然后取反。注:进位要相加到低位

5.接收到的报文:
IP头+ICMP头+数据;
其中
IP同包含应答主机的ip,
ICMP头的cmp_code = 8; //echo回送应答
数据部分为前面发送的icmp包。

6.
接收到的数据记录了发送的时间点。计算到接收时候的时间差就是往返时间。


阅读(743) | 评论(0) | 转发(0) |
0

上一篇:linux通信--socket

下一篇:没有了

给主人留下些什么吧!~~