21xrx.com
2024-12-23 01:47:52 Monday
登录
文章检索 我的文章 写文章
C++编写Ping程序
2023-07-01 00:32:48 深夜i     --     --
C++ Ping 编程 网络 工具

Ping程序是一种网络工具,它用于测试主机的连通性。Ping程序的工作原理是发送网络数据包到目标主机,然后等待目标主机返回一个响应。如果目标主机返回响应,则意味着主机之间的通信正常;否则,可能存在通信故障或目标主机无法到达。

在本文中,我们将介绍如何使用C++编写一个Ping程序。

1.准备工作

在开始编写Ping程序之前,您需要了解一些基本的网络知识和C++编程知识。您还需要使用以下头文件:

#include

#include

#include

#include

#include

#include

#include

#include

2.编写Ping函数

首先,您需要编写一个函数,它将负责发送Ping请求,并等待响应。

int Ping(const char* host) {

  // 创建Socket

  int sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);

  // 获取目标主机IP地址

  struct hostent* hent = gethostbyname(host);

  if (hent == NULL)

    std::cerr << "无法解析主机名" << std::endl;

    return -1;

  struct sockaddr_in addr;

  memset(&addr, 0, sizeof(addr));

  addr.sin_family = AF_INET;

  addr.sin_addr.s_addr = *((in_addr_t*)hent->h_addr_list[0]);

  // 填写ICMP头部信息

  struct icmp* icmp_header = (struct icmp*) malloc(sizeof(struct icmp));

  memset(icmp_header, 0, sizeof(struct icmp));

  icmp_header->icmp_type = ICMP_ECHO;

  icmp_header->icmp_code = 0;

  icmp_header->icmp_id = getpid();

  icmp_header->icmp_seq = 0;

  icmp_header->icmp_cksum = 0;

  icmp_header->icmp_cksum = htons(calc_checksum((u_short*) icmp_header, sizeof(struct icmp)));

  // 发送ICMP请求

  int send_rc = sendto(sock, icmp_header, sizeof(struct icmp), 0, (struct sockaddr*) &addr, sizeof(addr));

  if (send_rc == -1) {

    std::cerr << "发送Ping请求出错:" << strerror(errno) << std::endl;

    return -1;

  }

  // 等待响应

  struct timeval timeout;

  timeout.tv_sec = 10;

  timeout.tv_usec = 0;

  fd_set readfd;

  FD_ZERO(&readfd);

  FD_SET(sock, &readfd);

  int select_rc = select(sock + 1, &readfd, NULL, NULL, &timeout);

  if (select_rc <= 0)

    std::cerr << "未收到Ping响应" << std::endl;

    return -1;

  // 接收响应

  char buf[1024];

  sockaddr_in from;

  socklen_t fromlen = sizeof(from);

  int recv_rc = recvfrom(sock, buf, sizeof(buf), 0, (struct sockaddr*) &from, &fromlen);

  if (recv_rc == -1) {

    std::cerr << "接收Ping响应出错:" << strerror(errno) << std::endl;

    return -1;

  }

  struct icmp* rep = (struct icmp*) buf;

  if (rep->icmp_type == ICMP_ECHOREPLY)

    // 接收到正确的响应

    return 0;

   else

    std::cerr << "未收到Ping响应" << std::endl;

    return -1;

}

在函数中,我们创建一个socket对象,并使用gethostbyname函数获取目标主机的IP地址。然后,使用ICMP协议发送Ping请求,并等待响应。如果接收到响应,则返回0,否则返回-1。

3.编写主函数

接下来,我们将编写一个主函数,用于从命令行接收目标主机的名称,并调用Ping函数测试主机的连通性。

int main(int argc, char* argv[]) {

  if (argc < 2)

    std::cerr << "请输入目标主机名" << std::endl;

    return -1;

  const char* host = argv[1];

  int ret = Ping(host);

  if (ret == 0)

    std::cout << "Ping测试通过" << std::endl;

   else

    std::cout << "Ping测试失败" << std::endl;

  return 0;

}

主函数接收一个参数,即目标主机的名称。然后,通过调用Ping函数测试主机的连通性。最后,根据Ping的结果输出相应的消息。

4.编译和运行程序

完成上述代码后,您可以使用以下命令编译程序:

$ g++ ping.cpp -o ping

然后您可以运行程序来Ping您想要测试的主机。例如:

$ ./ping www.google.com

程序将返回Ping测试的结果。

总结

在本文中,我们介绍了如何使用C++编写一个Ping程序。我们先编写了一个Ping函数,它发送ICMP请求并等待响应。然后,我们编写了一个主函数,用于从命令行调用Ping函数并输出结果。希望本文能帮助您了解如何使用C++编写网络工具。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复