新聞中心
linux Ping 是 Linux 系統(tǒng)上傳統(tǒng)的網(wǎng)絡測試工具,常用于網(wǎng)絡上主機的存活檢測,某些功能如在線網(wǎng)絡測試;它是通過協(xié)議 ICMP 來實現(xiàn)它的網(wǎng)絡測試和管理,當 ping 命令發(fā)出之后,遠程主機就會收到一個 ICMP 協(xié)議的信息,ICMP 會回傳消息給本機,根據(jù)傳回來的消息就能夠獲知到網(wǎng)絡的通斷。Ping 技術內(nèi)部的機制在做網(wǎng)絡測試時很重要,此外,對于深入探究 Linux 的 Ping 源碼,也有助于了解深入ICMP 消息以及網(wǎng)絡的交互機制。

成都創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供額爾古納網(wǎng)站建設、額爾古納做網(wǎng)站、額爾古納網(wǎng)站設計、額爾古納網(wǎng)站制作等企業(yè)網(wǎng)站建設、網(wǎng)頁設計與制作、額爾古納企業(yè)網(wǎng)站模板建站服務,10余年額爾古納做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡服務。
Linux 中的 Ping 源碼分為三部分完成,第一部分是組裝 ICMP 消息發(fā)給遠程主機,第二部分是等待遠程主機的回應,第三部分是分析收到 ICMP 回應消息,更深入地探究 Linux Ping 源碼需要掌握它關鍵的 C 語言編程技術:sockaddr_in/sockaddr,sendto/recvfrom,gethostbyname/gethostbyaddr 以及 IP_HDRINCL。
Linux Ping 源碼文件以全局變量的形式聲明,并初始化:
“`c
char snd_packet [PACKET_SIZE],
rcv_packet[PACKET_SIZE];
struct sockaddr_in dstaddr;
socklen_t addr_len;
struct sockaddr_in from;
struct icmp *icmp_hdr;
struct ip *ip_hdr;
接下來在 main 程序中,首先創(chuàng)建 socket,然后填寫設置目標地址:
```c
// 創(chuàng)建套接字
int sockfd;
if ((sockfd = socket (AF_INET, SOCK_RAW, IPPROTO_ICMP))
{
perror ("socket error");
exit (1);
}
// 將要發(fā)送到目標地址
memset (&dstaddr, 0, sizeof (struct sockaddr_in));
dstaddr.sin_family = AF_INET;
dstaddr.sin_addr = dst;
之后就是設置 IP 首部信息和 ICMP 消息:
“`c
// 設置 IP 首部信息( IP_HDRINCL 會讓內(nèi)核不填充 IP 首部)
if (setsockopt (sockfd, IPPROTO_IP, IP_HDRINCL, &opt, sizeof (opt))
{
perror (“setsockopt error”);
exit (1);
}
// 設置 ICMP 消息
icmp_hdr = (struct icmp*) snd_packet;
icmp_hdr->type = ICMP_ECHO;
icmp_hdr->code = 0;
icmp_hdr->un.echo.id = getpid ();
icmp_hdr->un.echo.sequence = 0;
icmp_hdr->checksum = check_sum((unsigned short*) icmp_hdr, sizeof (struct icmp));
接下來:
```c
// 發(fā)送 ICMP 消息給目標地址
if ((sendto (sockfd, snd_packet, sizeof (snd_packet), 0, (struct sockaddr*) &dstaddr, sizeof (struct sockaddr_in)))
{
perror ("sendto error");
exit (1);
}
最后,接收 ICMP 消息并處理:
“`c
// 接收 ICMP 消息
addr_len = sizeof (struct sockaddr_in);
if (recvfrom (sockfd, rcv_packet, sizeof (rcv_packet), 0, (struct sockaddr*) &from, &addr_len)
{
perror (“recvfrom error”);
exit (1);
}
// 根據(jù)接收到的 ICMP 消息,判斷情況
if (icmp_hdr->type == ICMP_ECHOREPLY)
{
printf (“ping ok!\n”);
}
深入探究源碼,看清楚了 Linux Ping 工具的內(nèi)部機制。它使用到了 ICMP 協(xié)議,控制網(wǎng)絡通信前,先發(fā)送 ICMP 請求,再接收 ICMP 響應消息,然后根據(jù) ICMP 響應消息來判斷網(wǎng)絡連接正常,這樣就可以實現(xiàn)Ping 網(wǎng)絡測試了。
創(chuàng)新互聯(lián)【028-86922220】值得信賴的成都網(wǎng)站建設公司。多年持續(xù)為眾多企業(yè)提供成都網(wǎng)站建設,成都品牌網(wǎng)站設計,成都高端網(wǎng)站制作開發(fā),SEO優(yōu)化排名推廣服務,全網(wǎng)營銷讓企業(yè)網(wǎng)站產(chǎn)生價值。
新聞名稱:深入探究LinuxPing源碼,看清網(wǎng)絡通信內(nèi)部機理(linuxping源碼)
URL鏈接:http://fisionsoft.com.cn/article/dpcegig.html


咨詢
建站咨詢
