ping实现

ping

最近手头有点工作跟这个有段, 就实现一个简单ping. 不需要像源码那么详细. 就实现如图功能就行.

先说下原理:

  1. 使用ICMP协议, 组织ICMP

    socket_id = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
    告诉host我们要使用发送的报文是ICMP, 至于怎么发, 以及TCP通信的就是不是我们这里要关心的了

  2. 组织ICMP标示

p_icmp = (struct icmp *)buffer;
p_icmp->icmp_type = ICMP_ECHO;
p_icmp->icmp_code = 0;
p_icmp->icmp_cksum = 0;
p_icmp->icmp_seq = 12345;
p_icmp->icmp_id = getpid();
p_icmp->icmp_cksum = checkSum((uint16_t*)p_icmp, 64);
这里组织我们需要的ICMP的一些标示

  1. 发送ICMP给host

int send_chars = sendto(socket_id, (char *)buffer, 64, 0, (struct sockaddr*) &to, (socklen_t) sizeof(struct sockaddr_in));
发送ICMP包给你host

  1. 等待hostICMP响应包

int res = select(socket_id+1, &rfds, NULL, NULL, &tv);
receive_bytes = recvfrom(socket_id, packet, 1024, 0, (struct sockaddr *)&from, &fromlen)
等待host的响应

基本上这样一个简单的PING就可以了, 至于TCP之间的如何通信问题, 请查看SOCKET通信的相关资料

详细代码请查看我的github

参考文档:
https://www.cs.utah.edu/~swalton/listings/sockets/programs/part4/chap18/ping.c

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • iPhone的标准推荐是CFNetwork 库编程,其封装好的开源库是 cocoa AsyncSocket库,用它...
    Ethan_Struggle阅读 2,289评论 2 12
  • ping是常见的一个网络检测工具,牵涉到的核心协议是ICMP协议和IP头协议,下面橙色背景的字段为需要关心的部分 ...
    dbe007313549阅读 1,272评论 0 5
  • 之前做过微信公众号的项目,在微信公众号里可以购买公司提供的服务,因为项目是基于微信端,所以使用的是微信公众账号支付...
    菜菜___阅读 1,140评论 0 3
  • 大纲 一.Socket简介 二.BSD Socket编程准备 1.地址 2.端口 3.网络字节序 4.半相关与全相...
    VD2012阅读 2,458评论 0 5
  • Linux系统的一大特点是它的网络编程能力十分强大, 学习它, 让我们真正体会网络的魅力! 一. 客户机/服务器模...
    刘元旺阅读 6,561评论 0 5