// // Ping.h // #pragma pack(1) #define ICMP_ECHOREPLY 0 #define ICMP_ECHOREQ 8 #define REQ_DATASIZE 32 // Echo 请求数据的大小 class CPing { public: DWORD m_dwSendTime; HWND m_hWnd; //窗口句柄 BOOL Ping(UINT nNumIp, CString pstrHost, CString &m_Msg ); int WaitForEchoReply(SOCKET s); //ICMP回应的请求和回答函数 int SendEchoRequest(SOCKET, LPSOCKADDR_IN); DWORD RecvEchoReply(SOCKET, LPSOCKADDR_IN, u_char *); u_short in_cksum(u_short *addr, int len); protected: CString WSAError(LPCSTR pstrFrom); }; // IP Header -- RFC 791 typedef struct tagIPHDR { u_char VIHL; // Version and IHL u_char TOS; // Type Of Service short TotLen; // Total Length short ID; // Identification short FlagOff; // Flags and Fragment Offset u_char TTL; // Time To Live u_char Protocol; // Protocol u_short Checksum; // Checksum struct in_addr iaSrc; // Internet Address - Source struct in_addr iaDst; // Internet Address - Destination }IPHDR, *PIPHDR; // ICMP Header - RFC 792 typedef struct tagICMPHDR { u_char Type; // Type u_char Code; // Code u_short Checksum; // Checksum u_short ID; // Identification u_short Seq; // Sequence char Data; // Data }ICMPHDR, *PICMPHDR; // ICMP Echo Request typedef struct tagECHOREQUEST { ICMPHDR icmpHdr; DWORD dwTime; char cData[REQ_DATASIZE]; }ECHOREQUEST, *PECHOREQUEST; // ICMP Echo Reply typedef struct tagECHOREPLY { IPHDR ipHdr; ECHOREQUEST echoRequest; char cFiller[256]; }ECHOREPLY, *PECHOREPLY; #pragma pack() // // ping.cpp // #include "stdafx.h" #include "Ping.h" BOOL CPing::Ping(UINT nNumIp, CString pstrHost, CString &m_Msg ) { SOCKET rawSocket; LPHOSTENT lpHost; UINT nLoop; int nRet; struct sockaddr_in saDest; struct sockaddr_in saSrc; DWORD dwTimeSent; DWORD dwElapsed; u_char cTTL; char *destIP = NULL; WSADATA wsaData; //创建一个Raw套节字 int ret = WSAStartup(0x202, &wsaData); if( ret != 0) { m_Msg = "端口错误"; return FALSE; } rawSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); if (rawSocket == SOCKET_ERROR) { nRet = closesocket(rawSocket); ::WSACleanup(); m_Msg = WSAError("socket()"); return FALSE; } //获得主机信息 lpHost = gethostbyname(pstrHost); if (lpHost == NULL) { nRet = closesocket(rawSocket); ::WSACleanup(); m_Msg.Format("Host not found: %s", pstrHost); return FALSE; } //构造目标套节字地址信息 memset(&saDest, 0, sizeof(sockaddr_in)); saDest.sin_addr.s_addr = *((u_long FAR *) (lpHost->h_addr)); saDest.sin_family = AF_INET; saDest.sin_port = 0; //发送ICMP回应请求 SendEchoRequest(rawSocket,&saDest); nRet = WaitForEchoReply(rawSocket); if (nRet == SOCKET_ERROR){ nRet = closesocket(rawSocket); ::WSACleanup(); m_Msg = WSAError("select()"); return FALSE; } if(!nRet){ nRet = closesocket(rawSocket); ::WSACleanup(); m_Msg.Format("Request Timed Out"); return FALSE; } else{ //获得回应 dwTimeSent = RecvEchoReply(rawSocket, &saSrc, &cTTL); //计算时间 dwElapsed = GetTickCount() - dwTimeSent; //::Sleep(1000); destIP = inet_ntoa(saSrc.sin_addr);//获得客户IP地址 if(pstrHost == destIP){ nRet = closesocket(rawSocket); nRet = ::WSACleanup(); m_Msg.Format("OK!!!"); return TRUE; } else{ for(nLoop = 0; nLoop < nNumIp; nLoop++){ dwTimeSent = RecvEchoReply(rawSocket, &saSrc, &cTTL); destIP = inet_ntoa(saSrc.sin_addr); if(pstrHost == destIP){ nRet = closesocket(rawSocket); nRet = ::WSACleanup(); m_Msg.Format("OK !!!"); return TRUE; } } nRet = closesocket(rawSocket); nRet = ::WSACleanup(); m_Msg.Format("ERROR !!!"); return FALSE; } } } //发送ICMPECHO数据包请求 int CPing::SendEchoRequest(SOCKET s,LPSOCKADDR_IN lpstToAddr) { static ECHOREQUEST echoReq; static int nSeq = 1; int nRet; //构造回应请求 echoReq.icmpHdr.Type = ICMP_ECHOREQ; echoReq.icmpHdr.Code = 0; echoReq.icmpHdr.Checksum = 0; echoReq.icmpHdr.ID = (USHORT)GetCurrentThreadId(); echoReq.icmpHdr.Seq = nSeq++; for (nRet = 0; nRet < REQ_DATASIZE; nRet++) echoReq.cData[nRet] = ' '+nRet; //保存发送时间 echoReq.dwTime = GetTickCount(); this->m_dwSendTime = echoReq.dwTime; echoReq.icmpHdr.Checksum = in_cksum((u_short *)&echoReq, sizeof(ECHOREQUEST)); //发送请求 nRet = sendto(s, (LPSTR)&echoReq, sizeof(ECHOREQUEST), 0, (LPSOCKADDR)lpstToAddr, sizeof(SOCKADDR_IN)); if (nRet == SOCKET_ERROR){ ::closesocket(s); ::WSACleanup(); } return (nRet); } //接收ICMPECHO数据包回应 DWORD CPing::RecvEchoReply(SOCKET s, LPSOCKADDR_IN lpsaFrom, u_char *pTTL) { ECHOREPLY echoReply; int nRet; int nAddrLen = sizeof(struct sockaddr_in); //接收请求回应 nRet = recvfrom(s, (LPSTR)&echoReply, sizeof(ECHOREPLY), 0, (LPSOCKADDR)lpsaFrom, &nAddrLen); //检查返回值 if (nRet == SOCKET_ERROR){ ::closesocket(s); ::WSACleanup(); return FALSE; } //返回发送的时间 *pTTL = echoReply.ipHdr.TTL; return(echoReply.echoRequest.dwTime); } //等待回应 int CPing::WaitForEchoReply(SOCKET s) { struct timeval Timeout; fd_set readfds; readfds.fd_count = 1; readfds.fd_array[0] = s; Timeout.tv_sec = 0; // 秒 Timeout.tv_usec = 10; // 毫秒 return(select(1, &readfds, NULL, NULL, &Timeout)); } //转换地址 u_short CPing::in_cksum(u_short *addr, int len) { register int nleft = len; register u_short *w = addr; register u_short answer; register int sum = 0; while( nleft > 1 ) { sum += *w++; nleft -= 2; } if( nleft == 1 ) { u_short u = 0; *(u_char *)(&u) = *(u_char *)w ; sum += u; } sum = (sum >> 16) + (sum & 0xffff); sum += (sum >> 16); answer = ~sum; return (answer); } //错误处理 CString CPing::WSAError(LPCSTR lpMsg) { CString strMsg; strMsg.Format("%s - WSAError: %ld",lpMsg,WSAGetLastError()); //返回报错信息 return strMsg; }
您还没有登录,请您登录后再发表评论
通过ping 来测试客户端与服务器的连接状态,针对IP地址和域名都可以。
vc6.0环境下编写的ping类,MFC应用程序支持对指定Ip地址进行ping操作。 本程序原为一个简单的一个网络测试程序。
C++获取所有局域网可用IP,使用PING的方式简单易懂,但缺点就是时间消耗比较多,给新手看的,大神请无视 vs2010编译
其中ΧΧΧ为目的主机的IP地址,不要求支持域名,对是否带有开关变量也不做要求。不带开关变量时,要求返回4次响应。 返回信息的格式: REPLY FROM ΧΧΧ.ΧΧΧ.ΧΧΧ.ΧΧΧ 或 REQUEST TimeOut (无法PING通...
案例3 在窗口中PING一个IP地址 案例4 显示指定工作组内的所有计算机 案例5 电子邮件的发送与接收 案例6 简易WEB浏览器 案例7 FTP浏览器的制作 案例8 TCP点对点联机程序 案例9 UDP联机程序 案例10 C/S分布式...
摘要:VC/C++源码,网络相关,Ping 连续的Ping程序源码,基于Vc++.NET实现,输入指定的IP地址,输入重试次数,点击“开始Ping”即可实现连续的Ping功能。
84·获得主机名和IP地址 85·端口扫描 86·判断网址是否有效 87·枚举局域网内计算机 88·连续批量Ping测试 89·设置IE的标题 90·收发电子邮件 91·FTP上传下载 92·网络聊天WINSOCK-TCP 93·广播信息WINSOCK-UDP ...
网络应用、获取DNS、获取自己的IP地址、在窗口中PING一个IP地址、显示指定工作组内的所有计算机、电子邮件的发送与接收、简易WEB浏览器、FTP浏览器的制作、TCP点对点联机程序、UDP联机程序、C/S分布式QQ模型聊天室
ip地址扫描,发送邮箱。 ResizableLib 测试开源界面库Resizable。 RsPicture 自定义了一个图片库,然后引用测试。 SimplePlayer 简单的媒体播放源码。 Skin_Combo_Box_demo 自绘Combox控件的实例。 SkinList_...
VC++网络连接监控程序源代码,适合编写网络监控的编程者参考,选择监听的网络IP地址后才可以开始监听里程。并包括了IDS过滤器参数设置,几点提示: 1.初始状态只监听连接,不捕获IP数据 2.鼠标右击列表选择或取消...
128.11.68.63 - 要不,你就直接使用这个IP地址,这是我PING出来的IP。实现步骤: 0.初始化SOCKET 1.创建客户端SOCKET 2.向SOCK5服务器连接 3.向SOCK5服务器认证 4.与真正的服务器建立连接 之后就可以...
2、“IP地址”栏可以进行网卡选择,并显示网关地址; 3、“路由追踪”中增加“数据尺寸”,范围:32~128; 4、新增“包尺寸”参数,此参数为ping时的数据包大小,范围:32~1024; 5、修复当路径有空格时,“测速”...
内容索引:VC/C++源码,系统相关,Socks socksapp -vc++ 等服务器发送一个用户登录请求,并取得该POP3服务器的响应。该程序演示了如何使得自己的... 128.11.68.63 - 要不,你就直接使用这个IP地址,这是我PING出来的IP。
1.2.5ping其他计算机ip地址 1.3创建应用程序 1.3.1控制台程序 1.3.2mfc应用程序 1.4调试两个应用程序 1.4.1启动两个工程 1.4.2将一个工程加入到另一个工程空间 1.5配置开发环境 1.6小结 第2章tcp/ip简介 2.1开放系统...
本地计算机网络编程 57 2.1 获取计算机的名称和IP地址 57 2.2 获取计算机的子网掩码 60 2.3 获取计算机的DNS设置 62 2.4 获取计算机的网卡地址 63 2.5 获取计算机安装的协议 65 2.6 ...
7.3.2 实例:Ping程序 88 7.3.3 实例:网络嗅探器 92 7.4 服务器与客户端模型 96 7.4.1 实例:TCP服务端和客户端程序 96 7.4.2 实例:UDP服务器和客户端程序 100 7.5 实例:使用分层服务提供者LSP截取网络...
相关推荐
通过ping 来测试客户端与服务器的连接状态,针对IP地址和域名都可以。
vc6.0环境下编写的ping类,MFC应用程序支持对指定Ip地址进行ping操作。 本程序原为一个简单的一个网络测试程序。
C++获取所有局域网可用IP,使用PING的方式简单易懂,但缺点就是时间消耗比较多,给新手看的,大神请无视 vs2010编译
其中ΧΧΧ为目的主机的IP地址,不要求支持域名,对是否带有开关变量也不做要求。不带开关变量时,要求返回4次响应。 返回信息的格式: REPLY FROM ΧΧΧ.ΧΧΧ.ΧΧΧ.ΧΧΧ 或 REQUEST TimeOut (无法PING通...
案例3 在窗口中PING一个IP地址 案例4 显示指定工作组内的所有计算机 案例5 电子邮件的发送与接收 案例6 简易WEB浏览器 案例7 FTP浏览器的制作 案例8 TCP点对点联机程序 案例9 UDP联机程序 案例10 C/S分布式...
摘要:VC/C++源码,网络相关,Ping 连续的Ping程序源码,基于Vc++.NET实现,输入指定的IP地址,输入重试次数,点击“开始Ping”即可实现连续的Ping功能。
84·获得主机名和IP地址 85·端口扫描 86·判断网址是否有效 87·枚举局域网内计算机 88·连续批量Ping测试 89·设置IE的标题 90·收发电子邮件 91·FTP上传下载 92·网络聊天WINSOCK-TCP 93·广播信息WINSOCK-UDP ...
网络应用、获取DNS、获取自己的IP地址、在窗口中PING一个IP地址、显示指定工作组内的所有计算机、电子邮件的发送与接收、简易WEB浏览器、FTP浏览器的制作、TCP点对点联机程序、UDP联机程序、C/S分布式QQ模型聊天室
ip地址扫描,发送邮箱。 ResizableLib 测试开源界面库Resizable。 RsPicture 自定义了一个图片库,然后引用测试。 SimplePlayer 简单的媒体播放源码。 Skin_Combo_Box_demo 自绘Combox控件的实例。 SkinList_...
VC++网络连接监控程序源代码,适合编写网络监控的编程者参考,选择监听的网络IP地址后才可以开始监听里程。并包括了IDS过滤器参数设置,几点提示: 1.初始状态只监听连接,不捕获IP数据 2.鼠标右击列表选择或取消...
128.11.68.63 - 要不,你就直接使用这个IP地址,这是我PING出来的IP。实现步骤: 0.初始化SOCKET 1.创建客户端SOCKET 2.向SOCK5服务器连接 3.向SOCK5服务器认证 4.与真正的服务器建立连接 之后就可以...
2、“IP地址”栏可以进行网卡选择,并显示网关地址; 3、“路由追踪”中增加“数据尺寸”,范围:32~128; 4、新增“包尺寸”参数,此参数为ping时的数据包大小,范围:32~1024; 5、修复当路径有空格时,“测速”...
内容索引:VC/C++源码,系统相关,Socks socksapp -vc++ 等服务器发送一个用户登录请求,并取得该POP3服务器的响应。该程序演示了如何使得自己的... 128.11.68.63 - 要不,你就直接使用这个IP地址,这是我PING出来的IP。
1.2.5ping其他计算机ip地址 1.3创建应用程序 1.3.1控制台程序 1.3.2mfc应用程序 1.4调试两个应用程序 1.4.1启动两个工程 1.4.2将一个工程加入到另一个工程空间 1.5配置开发环境 1.6小结 第2章tcp/ip简介 2.1开放系统...
本地计算机网络编程 57 2.1 获取计算机的名称和IP地址 57 2.2 获取计算机的子网掩码 60 2.3 获取计算机的DNS设置 62 2.4 获取计算机的网卡地址 63 2.5 获取计算机安装的协议 65 2.6 ...
本地计算机网络编程 57 2.1 获取计算机的名称和IP地址 57 2.2 获取计算机的子网掩码 60 2.3 获取计算机的DNS设置 62 2.4 获取计算机的网卡地址 63 2.5 获取计算机安装的协议 65 2.6 ...
本地计算机网络编程 57 2.1 获取计算机的名称和IP地址 57 2.2 获取计算机的子网掩码 60 2.3 获取计算机的DNS设置 62 2.4 获取计算机的网卡地址 63 2.5 获取计算机安装的协议 65 2.6 ...
本地计算机网络编程 57 2.1 获取计算机的名称和IP地址 57 2.2 获取计算机的子网掩码 60 2.3 获取计算机的DNS设置 62 2.4 获取计算机的网卡地址 63 2.5 获取计算机安装的协议 65 2.6 ...
7.3.2 实例:Ping程序 88 7.3.3 实例:网络嗅探器 92 7.4 服务器与客户端模型 96 7.4.1 实例:TCP服务端和客户端程序 96 7.4.2 实例:UDP服务器和客户端程序 100 7.5 实例:使用分层服务提供者LSP截取网络...
7.3.2 实例:Ping程序 88 7.3.3 实例:网络嗅探器 92 7.4 服务器与客户端模型 96 7.4.1 实例:TCP服务端和客户端程序 96 7.4.2 实例:UDP服务器和客户端程序 100 7.5 实例:使用分层服务提供者LSP截取网络...