1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
| #include<winsock2.h> #include<iostream> #include<windows.h> #pragma comment(lib,"ws2_32.lib") using std::cout; using std::endl; #define DATALEN 1024
struct icmp_header{ unsigned char type; unsigned char code; unsigned short checksum; unsigned short id; unsigned short seq; unsigned long timestamp; };
unsigned short checksum(unsigned short* buf, int size) { unsigned long sum = 0; while(size>1){ sum += *buf++; size -= sizeof(unsigned short); } if(size){ sum += *(char*)buf; } sum = (sum >> 16) + (sum & 0xffff); sum += (sum >> 16); return (unsigned short)(~sum); }
int main(){ WSADATA data; WSAStartup(MAKEWORD(2,2), &data);
SOCKET sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); int ntime = 1000; setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (char*)&ntime, sizeof(ntime));
SOCKADDR_IN addr; addr.sin_family = AF_INET; addr.sin_port = htons(0); addr.sin_addr.S_un.S_addr = inet_addr("Your_IP");
char buf[sizeof(icmp_header)]; icmp_header* picmp = (icmp_header*)buf; picmp->checksum = 0; picmp->code = 0; picmp->id = (unsigned short)GetCurrentProcessId(); picmp->seq = 0; picmp->timestamp = 0; picmp->type = 8; connect(sockfd, (sockaddr*)&addr, sizeof(addr));
unsigned short nseq = 0; char recvbuf[32]; SOCKADDR_IN from; int nLen = sizeof(from); icmp_header* precvicmp; int ret;
while(nseq < 10){ picmp->checksum = 0; picmp->seq = nseq++; picmp->timestamp = GetTickCount(); picmp->checksum = checksum((unsigned short*)&buf, sizeof(icmp_header));
ret = send(sockfd, buf, sizeof(icmp_header), 0);
memset((void *)recvbuf, 0, sizeof(recvbuf)); ret = recvfrom(sockfd, recvbuf, sizeof(recvbuf), 0, (sockaddr*)&from, &nLen); if(ret == SOCKET_ERROR){ if(WSAGetLastError() == WSAETIMEDOUT){ cout << "Timed out! " << endl; continue; }else{ cout << "recv failed, error code: " << WSAGetLastError() << endl; return -1; } }
precvicmp = (icmp_header*)(recvbuf + 20); cout << ret << " bytes from: " << inet_ntoa(from.sin_addr); cout << " icmp_seq = " << precvicmp->seq; cout << " time: " << GetTickCount() - precvicmp->timestamp << " ms" << endl; Sleep(1000); }
closesocket(sockfd); WSACleanup(); return 0; }
|