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

成都創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供額爾古納網(wǎng)站建設(shè)、額爾古納做網(wǎng)站、額爾古納網(wǎng)站設(shè)計(jì)、額爾古納網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、額爾古納企業(yè)網(wǎng)站模板建站服務(wù),10余年額爾古納做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。
Linux 中的 Ping 源碼分為三部分完成,第一部分是組裝 ICMP 消息發(fā)給遠(yuǎn)程主機(jī),第二部分是等待遠(yuǎn)程主機(jī)的回應(yīng),第三部分是分析收到 ICMP 回應(yīng)消息,更深入地探究 Linux Ping 源碼需要掌握它關(guān)鍵的 C 語言編程技術(shù):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,然后填寫設(shè)置目標(biāo)地址:
```c
// 創(chuàng)建套接字
int sockfd;
if ((sockfd = socket (AF_INET, SOCK_RAW, IPPROTO_ICMP))
{
perror ("socket error");
exit (1);
}
// 將要發(fā)送到目標(biāo)地址
memset (&dstaddr, 0, sizeof (struct sockaddr_in));
dstaddr.sin_family = AF_INET;
dstaddr.sin_addr = dst;
之后就是設(shè)置 IP 首部信息和 ICMP 消息:
“`c
// 設(shè)置 IP 首部信息( IP_HDRINCL 會讓內(nèi)核不填充 IP 首部)
if (setsockopt (sockfd, IPPROTO_IP, IP_HDRINCL, &opt, sizeof (opt))
{
perror (“setsockopt error”);
exit (1);
}
// 設(shè)置 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 消息給目標(biāo)地址
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)部機(jī)制。它使用到了 ICMP 協(xié)議,控制網(wǎng)絡(luò)通信前,先發(fā)送 ICMP 請求,再接收 ICMP 響應(yīng)消息,然后根據(jù) ICMP 響應(yīng)消息來判斷網(wǎng)絡(luò)連接正常,這樣就可以實(shí)現(xiàn)Ping 網(wǎng)絡(luò)測試了。
創(chuàng)新互聯(lián)【028-86922220】值得信賴的成都網(wǎng)站建設(shè)公司。多年持續(xù)為眾多企業(yè)提供成都網(wǎng)站建設(shè),成都品牌網(wǎng)站設(shè)計(jì),成都高端網(wǎng)站制作開發(fā),SEO優(yōu)化排名推廣服務(wù),全網(wǎng)營銷讓企業(yè)網(wǎng)站產(chǎn)生價值。
文章題目:深入探究LinuxPing源碼,看清網(wǎng)絡(luò)通信內(nèi)部機(jī)理(linuxping源碼)
本文網(wǎng)址:http://www.5511xx.com/article/dpcegig.html


咨詢
建站咨詢
