手動新增檢驗和後正常。
原因:可能是baidu伺服器並沒有檢測校驗和就返回乙個echo,這樣可以減少伺服器的負擔。
而其他一些站點都會校驗。
注意點:ipv4的icmp,在原始套接字收到後,收到的是包含ip頭在內的完整資料報
ipv6的icmp,則是去除所有ip頭和擴充套件頭部的淨載荷。
#include "unp.h"
#include #include #include #include char sendbuf[maxline], recvbuf[maxline];
int datalen = 56, nseq = 0;
int sockfd;
struct sockaddr_in dst, src;
socklen_t dstlen, srclen;
void callfunc(int signo) ;
void send_icmp( ) ;
void recv_icmp();
unsigned short icmp_cksum(unsigned short *addr, int len);
int main( int argc, char **argv)
char buf[100];
struct addrinfo *addr, hints, *next;
struct sockaddr *servaddr;
struct sockaddr_in *temp;
bzero(&hints, sizeof(struct addrinfo));
hints.ai_family = af_unspec;
getaddrinfo(argv[1], null, &hints, &addr);
for(; addr != null; addr = addr->ai_next)
sockfd = socket(af_inet, sock_raw, ipproto_icmp);
setuid(getuid());
signal(sigalrm, callfunc);
callfunc(sigalrm);
for(;;)
}void callfunc(int signo)
void send_icmp( )
void cal_time(struct timeval *time1, struct timeval *time2)
void recv_icmp()
//printf("return a echo\n");
ip = (struct ip *)recvbuf;
hl = ip->ip_hl;
hl = hl<< 2;
icmp = (struct icmp *)(recvbuf + hl);
if(icmp == null)
printf("icmp is null\n");
assert(icmp);
assert(recvbuf);
rtime = (struct timeval *)malloc(sizeof(struct timeval));
if((icmp->icmp_type == 0) && (icmp->icmp_code == 0) &&(icmp->icmp_id == 88))
}unsigned short icmp_cksum(unsigned short *addr, int len)
if (nleft == 1)
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
answer = ~sum;
return(answer);
}
「ping」程式知多少
最近閱讀了 tcp ip詳解 卷1 協議 作者對 tcp ip協議族 進行了詳細的介紹,讓讀者對網際網路上執行的協議有了乙個全面的了解。本書共三十章,協議的總數也很多,不失為一本很好的網路參考書。我們經常使用 ping 來測試網路的連通性,想必大家對 ping 127.0.0.1 不會感到陌生。本文...
ping程式的實現
最近在看些windows下網路程式設計問題。看到原始套接字的使用,於是看了ping程式的功能實現。大部分人用ping命令只是作為檢視另乙個系統的網路連線是否正常的一種簡單方法。這裡我介紹下在windows下實現ping程式的兩種方法。一是使用原始套接字的方法 如下 include pragmacom...
c 封裝ping程式類
標頭檔案 pragma once include class cping 原始檔 include stdafx.h include ping.h include pragma comment lib,ws2 32.lib define icmp echo 8 定義回顯報文 define icmp e...