windowsSockets编程.pdf
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《windowsSockets编程.pdf》由会员分享,可在线阅读,更多相关《windowsSockets编程.pdf(23页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、陈家琪:计算机网络WinSock 网络编程第2页 共23页2UDP(用户数据报协议)提供无连接的数据 报传输服务。数据通过相互独立 的报文进行 传输,是无序的,并且不保证可靠、无差错。3.WinSock DLL?WinSock 与操作系统 的关系应用程序 1网络编程接口 如 WinSock API网络 通信协议如 TCP/IP 协议操作系统 如 Windows应用程序 2动态链接库物理 通信介 质?动态链接库:16位版:WINSOCK.DLL 32位版:WSOCK32.DLLDLL 装载WinSock 服务由动态连接库WinSock DLL提供,它完成 WinSock 的初始化任 务,协 商W
2、inSock 的版本支持,并分配必要的资源。在使用WinSock API 之前,必须调用:?int WSAStartup(WORD v,(LPWSADATA)&WD)其中:v 指示应用程序 对WinSock 版本的要求,低字节 为主版本号,高字节为副版本号。例:v1.1 v=Ox0101,v2.0 v=Ox0002,WD 返回WinSock 的实现 信息。WD 是一个 WSADATA 结构:struct WSADATA WORD wVersion;WORD wHighVersion;char szDescriptionWSADESCRIPTION_LEN+1;char szSystemStat
3、usWSASYSSTATUS_LEN+1;陈家琪:计算机网络WinSock 网络编程第3页 共23页3 unsigned short iMaxSockets;unsigned short iMaxUdpDg;char FAR*lpVendorInfo;结构成员说明wVersion:DLL 支持的WinSock 规范的 版本;wHighVersion:DLL 可支持 的WinSock 规范的 最高版本;szDescription:DLL 的说明及厂商描述;szSystemStatus:DLL 将相关 的状态和配置信息;iMaxSockets:一个进程可以打 开的最大套接口数 目;iMaxUdpD
4、g:应用程序发 送或接收的最大UDP数据报的大小;如果应用程序 没有给出限 制,iMaxUdpDg 为0(隐含为8192 字节)。最小值为512。lpVendorInfo:指向厂商 规定数据 结构的远指针。调用成功,返回0。DLL 卸载当不需WinSock DLL的服务,释放DLL 所使用的资源。应用程序 必须调 用:?int WSACleanup()调用成功,返回0。对应于每一次WSAStartup()调用必须有一个WSACleanup()调用。4.套接口 Socket Socket实际上是一个 通信端口;一个Socket是通讯的一端。网络通信将通过 各自的Socket 相联系。在应用开发
5、中就像使用文件句柄 一样,应用程序 向操作系统 申请,由操作系统 分配本地唯一 的Socket 端口号。然后,可以对 Socket 句柄进行读,写操作。?创建Socket:SOCKET socket(int af,/套接口 所用地址族 int type,/套接口 类型陈家琪:计算机网络WinSock 网络编程第4页 共23页4 int protocol/套接口 所用协议 )参数说明AF_INET TCP/IP 地址af AF_UNIX.UNIX地址SOCK_STREAM 数据流套接口,对应TCP协议SOCK_DGRAM 数据报套接口,对应UDP协议type.IPPROC_TCP 使用TCP/I
6、P 的TCP协议IPPROC_UDP 使用TCP/IP 的UDP协议.protocol 0 和 基本确定了一 种协议,若调用者不想指定,设置为0。返回值:若无错误发生,socket()返回引用套接口的 描述字(套接口 号)。否则的话,返回SOCKET_ERROR 错误,即-1。应用程序 可通过 WSAGetLastError()获取相应错误代码。5.主机地址标识网络环境中的唯一通信端点 标识。包含:协议、IP地址、端口。(俗称 三元组)关于端口:在TCP/IP 中,TCP与UDP使用彼此独立的端口;端口大小:16bit(共216个)端口分为:系统 全局端口:11023;例,HTTP为TCP/8
7、0,FTP为TCP/21、UDP/69,SMTP为TCP/25 系统 自动分配端口:10245000;自由端口:500065535;6.主机地址标识的数据结构struct sockaddr u_short sa_family;/协议族char sa_data14;/主机地址标识(端口号、IP 地址);陈家琪:计算机网络WinSock 网络编程第5页 共23页5struct sockaddr_in short sin_family;/协议族 u_short sin_port;/16bit端口号,网络字节顺 序 struct in_addr sin_addr;/32bit的IP 地址,网络 字节顺
8、 序 char sin_zero8;/未用;其中:struct in_addr u_long s_addr;/32bit的IP 地址,网络 字节顺 序;网络字节顺 序:16 bit/32 bit 整数存放格式 高字节在前,低字节在后。?设置主机地址/-void SetSockAddr(struct sockaddr_in*A,WORD Port,char*IP)A-sin_family =AF_INET;/TCP/IP协议A-sin_port =htons(Port);/端口号。A-sin_addr.s_addr =inet_addr(IP);/IP地址。/-函 数作 用htons()把16
9、bit 的数字从主机字节顺 序转换到网络字节顺 序inet_addr()把一个IP地址格式 A.B.C.D 转换成32 bit 的网络字节顺 序注:Intel CPU 的主机字节顺 序:16 bit/32 bit 整数存放格式 低字节在前,高字节在后。7.Socket 号与主机地址捆绑将IP地址和端口号与所创建 的Socket 号联系起来。?int bind(SOCKET s,/待捆绑 Socket struct sockaddr far*name,/赋予Socket的主机地址标识int len/name的长度);调用成功,返回0。陈家琪:计算机网络WinSock 网络编程第6页 共23页68
10、.WinSock操作模式同步模式 或阻塞模式(blocking mode)采用DOS技术编程,某些WinSock 函数(同步函 数)直到完成操作 后才返回。例,当执行数据接 收函数revc()时,一直等待对方发送数据,直到接收到数据后才返回。异步模式 或非阻塞模式(non-blocking mode)采用Windows 技术编程,利用 消息(事件驱动)的特点,使同步函 数变为异步函 数(不产生阻塞)。关键:异步选择函 数WSAAsyncSelect()的使用。WSAAsyncSelect()可设置一个或多个网络 事件消息,如,已收到数据、数据发 送完毕、客户机请求连接、服务器已完成连 接等网络
11、 事件。当设置的网络 事件发生时,Windows 应用程序的 窗口函数将收到一个消息。通过这个消息就可以进行相 应的处理。int WSAAsyncSelect(SOCKET s,/需要事件驱动的套接口HWND hWnd,/接收消息的窗口句柄unsigned int wMsg,/网络事件发生时的消息字long lEvent /用于指明感兴趣的网络 事件集合);lEvent参数由下表中列出的值组成:值意义FD_READ 已接收到数据FD_WRITE 数据发送完毕FD_OOB 已接收到边带数据FD_ACCEPT 客户机请求连接,用于服务 器端FD_CONNECT 服务器已完成连接,用于 客户机端FD
12、_CLOSE 连接关闭(对方的套接口 关闭)例:WSAAsyncSelect(S,hW,WM_USER+1,FD_ACCEPT|FD_READ|FD_CLOSE);程序结束时,应注销异步选择:WSAAsyncSelect(S,hW,0,0);陈家琪:计算机网络WinSock 网络编程第7页 共23页79.无连接协议的同步模式编程无连接服务器一般都是面向事务处理的。一个请求一个应答就完成了客户程序与服务程序 之间的相互作 用。工作过程:服务器服务请求服务应 答无连接套接口应用程序时序图S=socket(.)bind(S,.)sendto(S,.)recv(S,.)阻塞,等待客户 请求处理服务 请
13、求closesocket(S)继续 服务?YN客户机S=socket(.)bind(S,.)sendto(S,.)recv(S,.)阻塞,等待服务数据处理数据closesocket(S)继续?YN服务器首先启 动,通过调用socket()建立一个套接口,然后bind()将该套接口 和本地地址(IP 地址和端口)联系在一起,服务器调用recv()等待接收数据。客户机通过调 用socket()建立一个套接口,然后bind()将该套接口 和本地地址(IP 地址和端口)联系在一起,客户机调用sendto()向服务器发送数据;服务器的recv()接收到客户机的数据 后,调用sendto()向客户机发送应
14、答数据;客户机的recv()便接收到了服务 器的应答数据;最后,待数据传送结束后,双方调用closesocket()关闭套接口。陈家琪:计算机网络WinSock 网络编程第8页 共23页8编程示例:/UDP(TCP/IP)for the console application./VC6.0 add WSOCK32.LIB in Project-Settings.-Link#include stdafx.h#include /by user#include /by user WORD RPort=6666;/远程端口RemotePort char RIP16=127.0.0.1;/远程IP 地址
15、RemoteIPAddr WORD LPort=7777;/本地端口LocalPort char LIP16=127.0.0.1;/本地IP 地址LocalIPAddr SOCKET S;/套接口 SOCKET struct sockaddr_in rAddr;/远程参数,remoteAddr struct sockaddr_in lAddr;/本地参数,localAddr WSADATA WD;/WinSock DLL信息int r;/result;/-void ShowInfo(char*info)puts(info);exit(1);/-void SetSockAddr(struct s
16、ockaddr_in*A,WORD Port,char*IP)A-sin_family=AF_INET;/TCP/IP协议A-sin_port=htons(Port);/端口。A-sin_addr.s_addr=inet_addr(IP);/IP网址。/-void main()WORD v;/wVersionRequested;/-Startup Win Socket-v=0 x0101;/0 x0101 for v1.1,0 x0002 forv 2.0 r=WSAStartup(v,(LPWSADATA)&WD);if(r!=0)ShowInfo(Start_Error);/-Create
17、 Win Socket-S=socket(PF_INET,SOCK_DGRAM,0);if(S=-1)ShowInfo(Socket_Create_Error);int l=sizeof(rAddr);char Msg80;puts(Type exit then Quit Program!);SetSockAddr(lAddr,LPort,LIP);陈家琪:计算机网络WinSock 网络编程第9页 共23页9r=bind(S,(struct sockaddr far*)&lAddr,sizeof(lAddr);if(r=-1)ShowInfo(bind_Error);SetSockAddr(&
18、rAddr,RPort,RIP);do/-Send Mess-puts(Send:);gets(Msg);if(!strcmp(Msg,exit)break;r=sendto(S,Msg,strlen(Msg),0,(struct sockaddr far*)&rAddr,l);if(r=-1)ShowInfo(Send_Error);/-Recieve Mess-puts(Send ok!Waiting Recieve.);r=recv(S,Msg,80,0);/r=recvfrom(SD,Msg,80,0,(struct sockaddr far*)&rAddr,&l);/发送套接口的 主
19、机地址 信息存放在rAddr 中if(r=-1)ShowInfo(Recieve_Error);Msgr=0;puts(Msg);puts(Recieve ok!);while(1);closesocket(S);WSACleanup();return;/-说明:在VC中进行 WinSock API 编程开发,需要使用到下面三个文件:winsock.h WinSock API 的头文件wsock32.LIB WinSock API 的连接库,把它作为项目的非缺省 的连 接 库 包 含 到 项 目 文 件 中 去。(Project-Settings.-Link)wsock32.DLL WinSo
20、ck API 的动态 连接库,位于windows 的系统目录下(95/98:system、NT:system32)。?int sendto(/向一指定目的地发送数据SOCKET s,/源套接口char*buf,/待发送数据的缓冲区int buflen,/缓冲区 中数据的 长度int flags,/调用方式标志位,一般取0 struct sockaddr FAR*to,/指向目 的套接口的 主机地址int tolen/目的套接口 主机地址 的长度陈家琪:计算机网络WinSock 网络编程第10页 共23页10);主要用于 SOCK_DGRAM 类型套接口 向to 参数指定端的套接口发 送数据 报
21、。对于SOCK_STREAM 类 型套接口,to 和tolen 参数被忽略;这种情况 下sendto()等价于send()。?int recv(/从一个套接口接收数据SOCKET s,/接收套接口char*buf,/接收数据的 缓冲区int len,/缓冲区 中数据的 长度int flags/调用方式标志位,一般取0);?int recvfrom(/从一个套接口接收数据SOCKET s,/接收套接口char*buf,/接收数据的 缓冲区int len,/缓冲区 中数据的 长度int flags/调用方式标志位,一般取0 struct sockaddr FAR*from,/获取发送套接口的 主机
22、地址int fromlen/发送套接口的 主机地址的长度);陈家琪:计算机网络WinSock 网络编程第11页 共23页1110.无连接协议的异步模式编程A.程序结构UDP-WinSock-Windows 应用程序 结构图closesocket(S)客户机服务器S=socket(.)bind(S,.,lAddr)WSAAsyncSelect(S,.,USER+1,FD_READ)FD_READ处理服务请求WM_DESTROYWSAAsyncSelect(S,.,0,0)returnWM_CREATEWinMain(.)recvfrom(S,.,&rAddr)sendto(S,.,rAddr)W
23、ndProc(消息)USER+1windows消息处理closesocket(S)S=socket(.)WSAAsyncSelect(S,.,USER+1,FD_READ)FD_READ处理服务数据WM_DESTROYWSAAsyncSelect(S,.,0,0)returnWM_CREATEWinMain(.)recv(S,.)WndProc(消息)USER+1windows消息处理sendto(S,.,rAddr)发送消息事件WSACleanup()WSAStartup(.)WSAStartup(.)WSACleanup()设置本地lAddr设置服务器rAddr服务 请求服务数据注:服务器
24、端口:通过bind(),设置确定的服务 器端口号;服务器IP 地址:使用本地的主机IP 地址;客户机端口:由操作系统 自动分配;可以不使 用bind()。客户机IP 地址:使用本地的主机IP 地址;服务器收到客户 机的服务 请求时,revcfrom(S,.,&rAddr)可获得客户 机的主机地址信息rAddr,然后,发送sendto(S,.,rAddr)。陈家琪:计算机网络WinSock 网络编程第12页 共23页12B.编程示例服务器程序/服务器端口:6666;/服务器IP 地址:使用本机的主机IP 地址;/UDPSer01(TCP/IP)for the windows applicatio
25、n./*VC6.0 File-New-Projects-选项 (输入Project name:ServerW01-按OK按钮)-选项-按Finish按钮-按OK按钮-./VC6.0 add WSOCK32.LIB in Project-Settings.-Link#include stdafx.h/VC#include /by user/-char Title=UDPSer01;/窗口标题HINSTANCE hInst;/current instance LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);/-int APIENTRY WinMa
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- windowsSockets 编程
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内