ping 测试程序

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netinet/ip.h>   //ip
#include <netinet/tcp.h> //tcp
#include <linux/icmp.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

struct hc_icmp_packet{
	struct icmphdr head;
	char * data[32];
};


u_short icmp_cksum (u_char * addr, int len)
{
  register int sum = 0;
  u_short answer = 0;
  u_short *wp;

  for (wp = (u_short *) addr; len > 1; wp++, len -= 2)
    sum += *wp;

  /* Take in an odd byte if present */
  if (len == 1)
    {
      *(u_char *) & answer = *(u_char *) wp;
      sum += answer;
    }

  sum = (sum >> 16) + (sum & 0xffff);	/* add high 16 to low 16 */
  sum += (sum >> 16);		/* add carry */
  answer = ~sum;		/* truncate to 16 bits */
  return answer;
}


int main(int argc, char ** argv)
{
	int ret, sock, n;
	struct sockaddr_in addr;
	struct hc_icmp_packet icmp_packet;
	struct hc_icmp_packet icmp_packet_rcv;
	int addr_len = sizeof(struct sockaddr_in);
	char buff[256];
	
	if(argc!=2)
	{
		printf("not dest addr!\n");
	}
	
	sock = socket(AF_INET, SOCK_RAW,IPPROTO_ICMP);   //IP包方式 IPPROTO_RAW
	if (sock>0)
	{
		printf("socket ok sock = %d; errno =%d:%s\n",sock, errno, strerror(errno));
	}
	else
	{
		printf ("socket error sock = %d; errno =%d:%s\n",sock, errno, strerror(errno));
		return -1;
	}
	
	memset(&icmp_packet, 0, sizeof(icmp_packet));
	icmp_packet.head.type  = ICMP_ECHO;
	icmp_packet.head.un.echo.id = getpid();
	memcpy(icmp_packet.data, "abcdefghigklmnopqazsdgagadfgsefghi", 32);
	memset(&addr,0,sizeof(addr));
	
	addr.sin_family = AF_INET;
	inet_aton(argv[1],&addr.sin_addr);   //字符串转入地址

	icmp_packet.head.checksum = 0;
	icmp_packet.head.checksum = icmp_cksum((char *)(&icmp_packet), sizeof(icmp_packet));

	while(1)
	{
		ret = sendto(sock, (char *)(&icmp_packet), sizeof(icmp_packet), 0, (struct sockaddr *)&addr, addr_len);
		if(ret < 0)
		{
			printf("sendto sock = %d; errno =%d:%s\n",sock, errno, strerror(errno));
			return -1;  
		}
		memset(buff, 0, 256);
		/* 接收server端返回的报文,可以对接收到的报文加以判断等处理动作*/
		ret = recvfrom(sock, buff, 256, 0, (struct sockaddr *)&addr, &addr_len);
		printf("ret = %d\n",ret);

		sleep(2);
	}
	
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 好的,我可以帮你写一个基本的 ping 测试程序。在这里我们假设你已经知道了 ping 命令的基本用法。 首先,你需要使用 Python 的 `subprocess` 模块来调用系统的 ping 命令。你可以使用 `subprocess.run` 方法来执行命令,然后捕获它的输出。 ```python import subprocess def ping(host): result = subprocess.run(['ping', '-c', '3', host], stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) return result.stdout ``` 这样你就可以使用 `ping` 函数来测试一个主机的连通性了,例如: ```python print(ping("www.example.com")) ``` 这样你就可以看到 ping 命令的输出了。 如果你想要更复杂的功能,例如解析 ping 的输出以获取更多信息,或者根据测试的结果执行不同的操作,你可以对代码进行进一步的完善。 希望这对你有帮助! ### 回答2: 当然可以帮你写一个ping测试程序Ping是一种网络工具,用于测试网络连接的延迟和可用性。以下是一个简单的示例程序: ```python import os def ping(host): response = os.system("ping -c 1 " + host) if response == 0: return "主机 " + host + " 可以正常访问。" else: return "主机 " + host + " 无法访问。" host = input("请输入要测试的主机IP地址或域名:") result = ping(host) print(result) ``` 这个程序使用了Python的`os`模块,调用系统命令执行ping操作。它接收一个参数`host`,即要测试的主机IP地址或域名。程序会执行一次ping操作,然后根据返回的结果判断主机是否可以正常访问。 你可以运行这个程序,并输入你想要测试的主机IP地址或域名。程序会输出测试结果,告诉你主机是否可以正常访问。 请注意,这只是一个基本的示例程序,可能无法处理复杂的网络环境或特殊情况。在实际使用中,你可能需要根据具体需求对程序进行修改和扩展。 ### 回答3: ping测试程序是一种用于测试网络连接的工具。它通过向目标主机发送一个ICMP回显请求(ping请求),然后等待主机的回应(ping响应)来判断网络连接的质量和延迟情况。 在编写这个程序之前,我们需要安装Python的第三方库`ping3`,它可以用于执行ping测试。你可以使用以下命令在终端安装该库: ``` pip install ping3 ``` 接下来,我们可以编写一个简单的ping测试程序,如下所示: ```python from ping3 import ping, verbose_ping def ping_test(hostname): # 执行ping测试 delay = ping(hostname) # 输出结果 if delay is not None: print(f'成功连接到主机 {hostname},延迟为 {delay:.2f} 毫秒。') else: print(f'无法连接到主机 {hostname}。') def verbose_ping_test(hostname): # 执行详细ping测试 delay, _, _, _, _ = verbose_ping(hostname) # 输出结果 if delay is not None: print(f'成功连接到主机 {hostname},延迟为 {delay:.2f} 毫秒。') else: print(f'无法连接到主机 {hostname}。') # 示例用法1:执行简单ping测试 ping_test('www.example.com') # 示例用法2:执行详细ping测试 verbose_ping_test('www.example.com') ``` 上述程序中,我们使用了`ping3`库的`ping`和`verbose_ping`函数执行ping测试,并根据返回的结果输出连接状态和延迟信息。 你可以将`www.example.com`替换为你想要测试的主机名或IP地址,然后运行程序进行测试。程序将输出成功连接或无法连接的结果,并显示延迟时间。 希望以上内容能够帮助你编写一个简单的ping测试程序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Brickie-liu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值