日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【网络编程】之十三、ping程序实现

發(fā)布時(shí)間:2024/4/11 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【网络编程】之十三、ping程序实现 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

使用原始套接字:SOCK_RAW

需要ICMP

代碼如下:

[cpp]?view plaincopy
  • #include<iostream>??
  • #include<WinSock2.h>??
  • ??
  • using?namespace?std;??
  • ??
  • #pragma?comment(lib,?"WS2_32.lib")??
  • ??
  • typedef?struct?icmp_hdr{??
  • ????unsigned?char?icmp_type;??
  • ????unsigned?char?icmp_code;??
  • ????unsigned?short?icmp_checksum;??
  • ????unsigned?short?icmp_id;??
  • ????unsigned?short?icmp_sequence;??
  • ????unsigned?long?icmp_timnestamp;??
  • }ICMP_HDR,?*PICMP_HDR;??
  • ??
  • ??
  • typedef?struct?_IPHeader{??
  • ????UCHAR?iphVerLen;??
  • ????UCHAR?ipTOS;??
  • ????USHORT?ipLength;??
  • ????USHORT?ipID;??
  • ????USHORT?ipFlags;??
  • ????UCHAR?ipTTL;??
  • ????UCHAR?ipProtocol;??
  • ????USHORT?ipChecksum;??
  • ????ULONG?ipSource;??
  • ????ULONG?ipDestination;??
  • }IPHeader,?*PIPHeader;??
  • ??
  • USHORT?checksum(USHORT*?buffer,?int?size)??
  • {??
  • ????unsigned?long?cksum?=?0;??
  • ??
  • ????while(size?>?1)??
  • ????{??
  • ????????cksum?+=?*buffer++;??
  • ????????size?-=?sizeof(USHORT);??
  • ????}??
  • ??
  • ????//?奇數(shù),將最后一個(gè)字節(jié)擴(kuò)展到雙字,?再累加??
  • ????if(size)??
  • ????????cksum?+=?*(UCHAR*)buffer;??
  • ??
  • ????//高16??低16相加,取反??
  • ????cksum?=?(cksum?>>?16)?+?(cksum?&?0xffff);??
  • ????cksum?+=?(cksum?>>?16);??
  • ????return?(USHORT)(~cksum);??
  • }??
  • ??
  • int?main(void)??
  • {??
  • ????char?szDestIp[]?=?"127.0.0.1";??
  • ????SOCKET?sRaw=?::socket(AF_INET,?SOCK_RAW,?IPPROTO_ICMP);??
  • ????//SetTimeout(sRaw,?1000,?TRUE);??
  • ??
  • ????SOCKADDR_IN?dest;??
  • ????dest.sin_family?=?AF_INET;??
  • ????dest.sin_port?=?htons(5674);??
  • ????dest.sin_addr.S_un.S_addr?=?inet_addr(szDestIp);??
  • ??????
  • ????char?buff[sizeof(ICMP_HDR)?+?32];??
  • ????ICMP_HDR?*pIcmp?=?(ICMP_HDR*)buff;??
  • ????pIcmp->icmp_type?=?8;??
  • ????pIcmp->icmp_code?=?0;??
  • ????pIcmp->icmp_id?=?(USHORT)::GetCurrentProcess();??
  • ????pIcmp->icmp_checksum?=?0;??
  • ????pIcmp->icmp_sequence?=?0;??
  • ????memset(&buff[sizeof(ICMP_HDR)],?'E',?32);??
  • ??????
  • ????//發(fā)送??
  • ????USHORT?nSeq?=?0;??
  • ????char?recvBuf[1024];??
  • ????SOCKADDR_IN?from;??
  • ????int?nLen?=?sizeof(from);??
  • ????while(TRUE)??
  • ????{??
  • ????????static?int?nCount?=?0;??
  • ????????int?nRet;??
  • ????????if(nCount++?==?4)??
  • ????????????break;??
  • ????????pIcmp->icmp_checksum?=?0;??
  • ????????pIcmp->icmp_timnestamp?=?::GetTickCount();??
  • ????????pIcmp->icmp_sequence?=?nSeq++;??
  • ????????pIcmp->icmp_checksum?=?checksum((USHORT*)buff,?sizeof(ICMP_HDR)?+?32);??
  • ????????nRet?=?::sendto(sRaw,?buff,?sizeof(ICMP_HDR)?+?32,?0,?(SOCKADDR*)&dest,?sizeof(dest));??
  • ????????if(nRet?==?SOCKET_ERROR)??
  • ????????{??
  • ????????????cout?<<?"sendto?error:"?<<?::WSAGetLastError()?<<?endl;??
  • ????????????return?-1;??
  • ????????}??
  • ??
  • ????????nRet?=?::recvfrom(sRaw,?recvBuf,?1024,?0,?(sockaddr*)&from,?&nLen);??
  • ????????if(nRet?==?SOCKET_ERROR)??
  • ????????{??
  • ????????????if(::WSAGetLastError()?==?WSAETIMEDOUT)??
  • ????????????{??
  • ????????????????cout?<<?"time?out"?<<?endl;??
  • ????????????????continue;??
  • ????????????}??
  • ????????????cout?<<?"recvfrom?failed:"?<<?::WSAGetLastError()?<<?endl;??
  • ????????????return?-1;??
  • ????????}??
  • ??
  • ????????//解析??
  • ????????int?nTick?=?::GetTickCount();??
  • ????????if(nRet?<?sizeof(IPHeader)?+?sizeof(ICMP_HDR))??
  • ????????{??
  • ????????????cout?<<?"Too?few?bytes?from?"?<<?::inet_ntoa(from.sin_addr)?<<?endl;??
  • ????????}??
  • ??
  • ????????ICMP_HDR?*pRecvIcmp?=?(ICMP_HDR*)(recvBuf?+?sizeof(IPHeader));??
  • ????????if(pRecvIcmp->icmp_type?!=?0)??
  • ????????{??
  • ????????????cout?<<?"nonecho?type?"?<<?pRecvIcmp->icmp_type?<<?"?recvd"?<<?endl;??
  • ????????????return?-1;??
  • ????????}??
  • ????????if(pRecvIcmp->icmp_id?!=?::GetCurrentProcessId())??
  • ????????{??
  • ????????????cout?<<?"someone?ele's?packet!"?<<?endl;??
  • ????????????return?-1;??
  • ????????}??
  • ??
  • ????????cout?<<?nRet?<<?"?bytes?from?"?<<?inet_ntoa(from.sin_addr)?;??
  • ????????cout?<<?"icmp_seq?=?"?<<?pRecvIcmp->icmp_sequence?;??
  • ????????cout?<<?"time:?"?<<?nTick?-?pRecvIcmp->icmp_timnestamp?<<?"?ms";??
  • ????????cout?<<?endl;??
  • ????????Sleep(1000);??
  • ????}??
  • ??
  • ??
  • ????return?0;??
  • }??



  • ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?jofranks ?13.7.24 于南昌

    版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。

    總結(jié)

    以上是生活随笔為你收集整理的【网络编程】之十三、ping程序实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。