当前位置:首页 > 嵌入式 > 嵌入式软件
[导读] 如果目的主机在工 输出在工状态 如果5妙内无相应 用SIGALRM信号中断进程#include "unp.h"void send_echo_req(int sockfd, struct sockaddr_in *dstaddr);uint16_t in_cksu

 如果目的主机在工 输出在工状态 如果5妙内无相应 用SIGALRM信号中断进程

#include "unp.h"

void send_echo_req(int sockfd, struct sockaddr_in *dstaddr);

uint16_t in_cksum(uint16_t *addr, int len);

void recv_echo_reply(int sockfd);

int main(int argc, char **argv)

{

int sockfd;

struct sockaddr_in dstaddr;

if ((sockfd = socket(PF_INET, SOCK_RAW, IPPROTO_ICMP)) == -1)

err_sys("socket");

bzero(&dstaddr, sizeof(dstaddr));

dstaddr.sin_family = AF_INET;

dstaddr.sin_port = htons(0);

if (inet_pton(AF_INET, argv[1], &dstaddr.sin_addr) <= 0)

err_sys("inet_pton");

send_echo_req(sockfd, &dstaddr);

recv_echo_reply(sockfd);

exit(0);

}

void send_echo_req(int sockfd, struct sockaddr_in *dstaddr)

{

char buf[100];

size_t len = sizeof(struct icmp);

struct icmp *icmp;

socklen_t dstlen = sizeof(struct sockaddr_in);

bzero(buf, sizeof(buf));

icmp = (struct icmp *)buf;

icmp->icmp_type = ICMP_ECHO;

icmp->icmp_code = 0;

icmp->icmp_id = getpid();

icmp->icmp_seq = 1;

icmp->icmp_cksum = in_cksum((uint16_t *) icmp, sizeof(struct icmp));

if (sendto(sockfd, buf, len, 0, (SA *)dstaddr, dstlen) == -1)

err_sys("sendto");

}

void recv_echo_reply(int sockfd)

{

char buf[100];

ssize_t n;

struct ip *ip;

struct icmp *icmp;

while (1) {

alarm(5); /* set timeout */

if ((n = read(sockfd, buf, sizeof(buf))) == -1)

err_sys("read");

ip = (struct ip *)buf;

if (ip->ip_p != IPPROTO_ICMP) {

fprintf(stderr, "protocol error.\r\n");

exit(1);

}

icmp = (struct icmp *)(buf + sizeof(struct ip));

if (icmp->icmp_type == ICMP_ECHOREPLY) {

if (icmp->icmp_id != getpid()) {

fprintf(stderr, "not this process.\r\n");

exit(1);

} else {

printf("destination host is alive.\r\n");

break;

}

}

}

}

uint16_t in_cksum(uint16_t *addr, int len)

{

int nleft = len;

uint32_t sum = 0;

uint16_t *w = addr;

uint16_t answer = 0;

while (nleft > 1) {

sum += *w++;

nleft -= 2;

}

if (nleft == 1) {

*(unsigned char *)(&answer) = *(unsigned char *)w ;

sum += answer;

}

sum = (sum >> 16) + (sum & 0xffff);

sum += (sum >> 16);

answer = ~sum;

return(answer);

}

void err_sys(const char *errmsg)

{

perror(errmsg);

exit(1);

}

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读

苏州2026年10月15日 /美通社/ -- 10月15日,DEKRA德凯苏州检测中心在吴江经济技术开发区正式落成并投入运营。这座超12,000平方米的现代化检测中心,是DE...

关键字: AN 测试 新能源汽车 IC

新加坡和阿姆斯特丹2026年10月12日 /美通社/ -- 在 Euronext Amsterdam 上市的 SWI Group(“SWI”;股票代码:SWICH)今日宣布获...

关键字: GROUP AI IC 代码

杭州2026年10月12日 /美通社/ -- 10月12日,浙江华感科技有限公司(以下简称"华感科技")正式发布旗下星界一体机系列热成像仪 AH315。作为大华股份(股票代码:002236)旗下创新业...

关键字: 热成像 折叠屏 IP PI

台湾新竹 – 2026 年 10 月 1 日 –––全球半导体领导供货商新唐科技股份有限公司(Nuvoton Technology Corporation)正式推出 NuMicro® MA35D0 系列最新 LQFP12...

关键字: MPU Linux 智能网关

今年的调查报告聚焦高净值收藏家如何开始建立自己的收藏,重点揭示家庭的影响、年轻世代购买活跃度的上升、对隐私的重视度,以及数字和人工智能工具在收藏研究中的日益使用 香港202...

关键字: 人工智能 IC COM CAN

Orfali Bros 晋升 Two MICHELIN Stars(二星餐厅),迪拜现有的 Three and Two MICHELIN Star(三星和二星餐厅)均保持原有评级KIGO 和 Birch 首次入选,获评...

关键字: GUIDE IC GO RS

上海2026年10月5日 /美通社/ -- 第九届中国国际进口博览会(以下简称"进博会")将于11月5日至10日在上海国家会展中心举办。作为进博会的老朋友,全球领先的生物制药企业勃林格殷格翰...

关键字: 管线 BSP FDA IC

深圳2026年9月30日 /美通社/ -- 近日,忆联携手英特尔共同推出《基于Intel KV Cache高性能存储的Agentic AI高效推理加速最佳实践》解决方案白皮书。方案以英特尔® 至强® 6处...

关键字: 英特尔 TI IC AI

携手UICC共同呈现"生命故事:癌症之旅"主题影像展 上海2026年9月24日 /美通社/ -- 2026年9月24日至26日,富士胶片集团作为世界抗癌联盟(Union for Internatio...

关键字: 富士 影像 IC UI

米尔电子 MYD-LR3576 Android V2.0.1 现已正式发布。继 V1.0.0 版本支持 Android 14 后,本次发布将系统升级至 Android 15,并围绕系统基线、板级功能和使用体验进行三重升级...

关键字: 开发板 Android 15 Linux
关闭