第27卷第5期 唐山师范学院学报 2005年9月 Vol. 27 No.5 Journal of Tangshan Teachers College Sep. 2005
────────── 收稿日期:2005-04-02 作者简介:闫敬(1973-),女,河北张家口人,唐山师范学院计算机科学系讲师。 - 87 -
Winsock 与ICMP 网络编程
闫 敬1,李银兵2,郭 阳1
(1.唐山师范学院 计算机科学系,河北 唐山 063000;2.唐山学院 计算机中心,河北 唐山 063000)
摘 要:介绍Winsock 与ICMP 网络编程的概念和程序设计方法,并给出一个网络自动测试程序实例,在VC++6.0下调试通过。
关键词:Winsock ;ICMP ;VC++
中图分类号:TP311 文献标识码:A 文章编号:1009-9115(2005)05-0087-03
1 概述
套接字(Socket )最初是由加利福尼亚大学Berkeley 分校为UNIX 操作系统开发的网络通信接口,Socket 指一个通信端点,借助于它,用户所开发的Socket 应用程序,可以通过网络与其它Socket 应用程序进行通信。WINDOWS SOCKETS 是一套开放的、支持TCP/IP 等多种网络协议的WINDOWS 下网络通讯的编程接口,已成为WINDOWS 网络编程事实上的标准。 2 WinSock 的编程特点 2.1 数据传输
WinSock 支持两种类型的套接字,即流式套接字(SOCK_STREAM )和数据报套接字(SOCK_DGRAM )。对于要求精确传输数据的Windows Sockets 通信程序,一般采用流式套接字。流式套接字提供了一个面向连接的、可靠的、数据无错的、无重复发送的及按发送顺序接收数据的服务。其内设流量控制,避免数据流超限,同时,数据被看作是字节流,无长度限制。 2.2 阻塞及其处理方式
Winsock 对有可能阻塞的函数提供了两种处理方式:阻塞和非阻塞方式。在阻塞方式下,收发数据的函数在被调用后一直要到传送完毕或者出错才能返回。在阻塞期间,被阻的函数会不断调用系统函数GetMessage()来保持消息循环的正常进行。对于非阻塞方式,函数被调用后立即返回,当传送完成后由Winsock 给程序发一个事先约定好的消息。在编程时,应尽量使用非阻塞方式,因为在阻塞方式下,用户可能会在长时间的等待过程中试图关闭程序,程序的窗口可能被关闭,当函数从Winsock 的动态链接库中返回时,主程序已经从内存中删除,这是很危险的。 2.3 WinSock 的API 编程开发 2.3.1 使用的文件
WinSock.h——WinSock API 的头文件 Wsock32.lib——WinSock API 链接库文件 WinSock.dll——WinSock 的动态链接库 2.3.2 主要函数
int WSAStartup (WORD wVersionRequested,
LPWSADATA lpWSAData);
——判断应用程序是否与WinSock 库成功连接 int WSACleanup (void);——注销WinSock 库 SOCKET socket (int af,int type,int protocol); ——建立使用特定协议的网络套接字
int bind (SOCKET s,const struct sockaddr FAR*name,
int namelen);——进程为套接字分配端口
int listen (SOCKET s,int backlog); ——准备被连接,在服务程序上使用 SOCKET accept (SOCKET s,
struct sockaddr FAR*addr, int FAR*addrlen};
——服务端接收连接请求
int recv { SOCKET s,char FAR*buf;int len;int flags}; ——从连接的另一端接收信息 3 控制报文协议ICM
P
IP 协议在传输数据报时可能发生丢失,为了减少分组数据报的丢失,可以使用Internet 控制报文协议ICMP ,ICMP 允许主机或路由器报告差错情况和提供有关异常情况的报告。
针对网间层的错误诊断、阻塞控制、路径控制和查询服务四大功能,ICMP 提供相应的报文。
ICMP 报文分成头标和数据区两部分,其中头标包含类型、代码和校验和三个域,共有四个字节。数据区长度可变,它取决于ICMP 的类型。
4 本文在VC++6.0下编写一个有语音报警功能的网络自动
第27卷第5期 唐山师范学院学报 2005年第5期
- 88 -
测试程序(NetTest),旨在介绍WINDOWS SOCKETS 函数和网间控制报文协议(ICMP )在网络编程中的使用。
本程序功能的实现是利用WinSock 原始套接字sockRaw ,ICMP 报文中的回响请求报文和回响应答报文
来测试目的站点的可达性,同时也可以发送一系列的回响请求并根据捕获的响应提供丢失数据报的统计。
用VC++6.0实现该程序,部分源代码如下:
4.1 创建NetTest 工程,为单文档,在创建的STEP 4,要选中WINDOWS SOCKETS 选项. 4.2 添加AUTO.CPP 文件,代码如下: //#include 头文件略 typedef struct _ihdr { BYTE i_type, i_code; u_short i_cksum,i_id, i_seq; }IcmpHeader;
struct sockaddr_in saDestAddr; u_short checksum(u_short *buffer, int size) { . . . . . . .(略)}
BOOL Autotest(char far * szDestHost,int Ktest) {WSADATA wsaData;
SOCKET sockRaw;//建立一个原始套接字sockRaw . . . . . . .(略) int timeout = 1000; //ms
WSAStartup(MAKEWORD(2,1),&wsaData) ; //初始化WINSOCK DLL
sockRaw = socket (AF_INET,SOCK_RAW,IPPROTO_ICMP); setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO, (char*)&timeout,sizeof(timeout) ); // SO_RCVTIMEO 参数来设置接收超时 memset(&dest,0,sizeof(dest)); dest.sin_family = AF_INET;
dest.sin_addr.s_addr=inet_addr(szDestHost); memset(icmp_data,0,sizeof(icmp_data)); //给被测节点的dest 和Icmpheader 结构变量赋值 //szDestHost 放被测节点的IP 地址(点间隔格式), ((IcmpHeader*)icmp_data)->i_type = 8; //发送一个请求响应数据包(ICMP_ECHO ) ((IcmpHeader*)icmp_data)->i_code = 0;
((IcmpHeader*)icmp_data)->i_id=(u_short)GetCurrentPr ocessId();
//i_id 为数据包的标识
((IcmpHeader*)icmp_data)->i_seq = 0; //i_seq 用来为发送包计数 for(int k=0; k<3;k++)
{
((IcmpHeader*)icmp_data)->i_cksum = 0; // i_cksum 为数据包的校验和 ((IcmpHeader*)icmp_data)->i_seq ++;
((IcmpHeader*)icmp_data)->i_cksum=checksum((u_short*)ic mp_data,8);
sendto(sockRaw,icmp_data,8,0,(struct sockaddr*)&dest,sizeof(dest)); //向被测节点发送信息
int bread=recvfrom(sockRaw,recvbuf,1024,0, (struct sockaddr*)&from, &fromlen); //接收被测节点的应答信息 if (bread == SOCKET_ERROR){ if(k==Ktest-1) goto ERR1 ; else continue; //重试(3次) }} ERR1:
closesocket (sockRaw);// 关闭套接字 sockRaw= INV ALID_SOCKET; WSACleanup();//注销WinSock 库 return FALSE;}
4.3在工程中增加自动测试的有关菜单和函数 4.3.1增加OnDestroy()函数: void CNetTestView::OnDestroy()
{ CView::OnDestroy(); int i;
GlobalFree(hHost); //释放装载有初始化信息的内存 for (i=0; i<nodeNum; i++)
DeleteObject(hHost[i].hrgn);} 4.3.2增加自动测试菜单AutoTest : void CNetTestView::OnAutotest()
{ SetTimer(1, 600000,NULL);//定时器设为每10分钟中断一次
Tc=20; //计算中断次数 CWnd* pParent=GetParent();
CMenu * pMenu=pParent->GetMenu();
pMenu->EnableMenuItem(ID_AUTOTEST,MF_BYCOMMA ND| MF_DISABLED | MF_GRAYED); AfxGetMainWnd()->SendMessage (WM_TIMER,0,
0L); }//转到OnTimer()函数开始自动测试。
4.3.3增加定时测试代码:
void CNetTestView::OnTimer(UINT nIDEvent) {
if(Tc++<20) return;
闫 敬,李银兵,郭 阳:Winsock 与ICMP 网络编程
- 89 -
KillTimer(1); Tc=0;
BOOL bOK=TRUE; InvalidateRect(NULL);
{if(Autotest(lpHost[ipT].nodeIP,3)==FALSE) { ……略}
else if(bOK) sndPlaySound("right.wav", SND_ASYNC);} SetTimer(1, 600000,NULL); CView::OnTimer(nIDEvent); } 5 小结
该程序类似于常用的网络测试命令Ping 和Tracert ,为图形界面,设计为每10分钟测试网络连接状况以及信息包发送和接收状况一次,可显示数据包到达目标主机所走的全部路径、节点的IP 以及花费的时间,比较适用于大、中型网络。如果执行NetTest 不成功,可以预测故障出现在以下几个方面:网线故障,网络适配器配置不正确,IP 地址不正确。如果执行NetTest 成功而网络仍无法使用,问题可能出在网络系统的软件配置方面,NetTest 成功保证本机与目标主机间存在一条连通的物理路径。settimer头文件
本程序有助于更快地检测网络故障所在,从而节省时间,提高效率。
参考文献:
[1] Anthony Jones,Jim Ohlund.Windows 网络编程技术[M].北京:机械工业工业出版社,2000. [2] 萧秋水. Windows 网络编程之VC 篇[M].北京:清华大学出版社,2002.
Net Program with Winsock and ICMP
YAN Jing 1, LI Yin-bing 2, GUO Yang 1
(1.Department of Computer Science, Tangshan Teachers College, Hebei Tangshan 063000, China;
2.Center of Computer, Tangshan College, Hebei Tangshan 063000, China;)
Abstract: This paper introduces the concept and ways to program in network with Winsock and ICMP, and demonstrates with an example automatically produced in network, which has gone through VC++6.0.
Key words: Winsock; ICMP; VC++
责任编辑、校对:田敬军
(上接第78页)
Analysis on the Characteristics and Developing Trend of Triple Jump
Technique
ZHU Xiu-li
(Tangshan Number 22 Middle School, Hebei Tangshan 063000, China)
Abstract: The thesis make an analysis based on the technique and achievement of world famous triple
jump athletes, getting the technical characteristics and developing trend of nowadays’ men’s triple jump are: I The accelerating of running up speed and going up board speed; II The developing of technical style towards the reducing of every jumping speed; III The strengthening of the taking off speed and swinging technique.
Key words: triple jump; technical characteristic; running up speed; utilization ratio of speed; three jumped ratio
责任编辑、校对:孙海祥
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论