WindowsSockets基础1.ppt_第1页
WindowsSockets基础1.ppt_第2页
WindowsSockets基础1.ppt_第3页
WindowsSockets基础1.ppt_第4页
WindowsSockets基础1.ppt_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章 Windows Sockets基础,南昌大学 何俊,本章内容,1 Windows Sockets概念 2 编程应注意的协议特征及IP定址概念 3 基本TCP套接字编程及示例程序(重点) 4 基本UDP套接字编程及示例程序(重点) 5 套接字选项,3.1 Windows Sockets,一. 什么是Windows Sockets Windows Sockets是Microsoft Windows的网络程序设计接口,它是从Berkeley Sockets扩展而来的,以动态链接库的形式提供给我们使用。Windows Sockets在继承了Berkeley Sockets主要特征的基础上,又对它进行了重要扩充。这些扩充主要是提供了一些异步函数,并增加了符合Windows消息驱动特性的网络事件异步选择机制。 Windows Sockets 1.1和Berkeley Sockets都是基于TCP/IP协议的;Windows Sockets 2从Windows Sockets 1.1发展而来,与协议无关并向下兼容,可以使用任何底层传输协议提供的通信能力,来为上层应用程序完成网络数据通讯,而不关心底层网络链路的通讯情况,真正实现了底层网络通讯对应用程序的透明。 1) 是网络编程接口 2) 支持多种协议 3) 可利用消息驱动机制开发程序,二. 应用程序与Windows Sockets的关系,Windows Sockets应用程序A,Windows Sockets应用程序B,Windows Sockets,网络通信协议(TCP/IP),Windows操作系统,物理通信介质,三. 套接字 1. 概念: 1)是应用层到传输层的接口; 2)一个套接字就是通信双方的一个端点; 3)类似句柄,它包括一个TCP连接中双方的IP地址和连接状态;,2. 套接字种类: 1)流套接字 提供双向有序、无重复、无记录边界的数据流服务 2)数据报套接字 也支持双向数据流,但不保证数据是可靠的、有序的、无重复的 3. 套接字类型声明方式 typedef unsigned int u_int; typedef u_int SOCKET 4. 判断套接字是否创建成功的方法 SOCKET s=socket(.); if(INVALID_SOCKET=s) /失败,3.2 编程应注意的协议特征及IP定址概念,1. 按连接方式网络服务分2种 1)面向连接: 可靠完整、保证数据顺序、费时 2)面向无连接: 实时、不可靠、不保证数据顺序,2. 从容关闭(大多数面向连接支持) 1)如果面向连接协议支持,则在关闭过程中,一方即使关闭连接,另一方仍可读取网络堆栈中的数据;否则只要一方关闭就会中断连接并丢失数据; 注:对TCP协议,只有双方都关闭,连接才完全中断 2)关闭套接字连接与关闭套接字的不同 关闭连接:双方要交换协议消息,按顺序关闭。 例如:shutdown(), WSASendDisconnect() 关闭套接字:指关闭套接字句柄,释放占用资源。 例如:closesocket()。(它隐含了shuntdown(),3)Sockets定义了两种关闭方式 A. 从容关闭:把等待发送的数据发送出 去,才关闭; B. ”硬“关闭:没有发送的数据丢弃。 4)从容关闭的方法(2种) A. 设置套接字选项来控制closesocket() B. 我们可以采用以下方法,客户端/服务器执行从容关闭的过程 1、以SD_SEND为参数调用shutdown(),关闭连接。表明客户端不再发送数据(但仍可接受数据) 2、服务器收到FD_CLOSE网络事件,得知客户端正在从容关闭;此时,数据都已经被服务器接收。 3、服务器发送数据 4、服务器以SD_SEND为参数调用shutdown()。通知客户端不要发数据了,再执行closesocket()。 5、客户端收到FD_READ网络事件后,开始接收数据,当然最后会收到FD_CLOSE网络事件。 6、客户端调用closesocket()关闭套接字。,Client Server 1.Shutdown() 2. FD_CLOSE 3.发送数据 4.shutdown() 5.FD_READ 4.closesocket() 5.FD_CLOSE 6. closesocket(),(5)路由选择 1)若协议可路由,则不管什么网络硬件,该协议会把数据包定向到路由器,由路由器决定最佳转发方式; 2)若协议不可路由,路由器将数据丢弃。 (6)广播数据 1)定义:某主机发出数据,局域网内的所有主机都能收到该数据。 2)特点:适用于无连接的协议。一般多数主机将这个数据丢弃。,IP定址 1 、 IP协议定址方案 WinSock使用AF_INET地址家族为IP通信定址。 无论客户端发送数据,或者服务器端监听,都需要服务器的IP地址与端口号。 SOCKADDR_IN结构被用来指定IP地址和端口号 struct sockaddr_in short sin_family;/地址家族,对于TCP/IP, 只能为AF_INET unsigned short sin_port;/服务器端口号 /一般取102449151 struct in_addr sin_addr; /in_add类型的IP地址 /用于把IP地址保存为一个4字节的值 char sin_zero8;/填充使该结构与SOCKADDR同样大小 ; IN_ADDR 结构 struct in_addr union struct u_char s_b1,s_b2,s_b3,s_b4; S_un_b; struct u_short s_w1,s_w2; S_un_w; u_long S_addr; S_un; 作用:通常利用此结构,将一个点分十进制格式的IP地址转为u_long类型,并将结果赋给 S_addr,2、字节顺序 在计算机中,IP地址与端口号被指定为多字节数字时,按“主机字节”顺序表示; 但在网络中,IP地址与端口号必须按照“网络字节”形式表示(“大头”) 二者之间的转换方法: 1. 主机字节 网络字节 htonl()或者htons() 2. 网络字节 主机字节 ntohl()或者ntohs(),3.3 基本TCP套接字编程及示例程序,服务器端 初始化: WSAStartup() 创建套接字 绑定: bind() 监听: listen() 接受连接: accept() 收发数据 关闭,客户端 初始化:WSAStartup() 创建套接字 连接: connect() 收发数据 关闭,各调用函数介绍,1. WSAStartup() (1)作用:加载Sockets动态库(.DLL),例如加载WS2_32.DLL。以及版本协商。 (2)声明: int WSAStartup ( WORD wVersionRequested, /(in)指定动态库的版本 /低字节指定主版本,高字节对应副版本 /由makeword(高字节,低字节)设定该值 LPWSADATA lpWSAData /(out)指向WSADATA结 / 构的指针,返回被加载动态库的信息 (下页) );,其中,WSAData结构声明: typedef struct WSAData WORD wVersion;/返回的版本号 WORD wHighVersion;/该库能支持的最高版本 char szDescriptionWSADESCRIPTION_LEN+1; /DLL的描述信息(无用) char szSystemStatusWSASYS_STATUS_LEN+1; /DLL的状态信息(无用), unsigned short iMaxSockets;/一个进程可打开套接字 /的最多数量2.0版忽略它 unsigned short iMaxUdpDg; /一个进程发送或接收的最 /大数据报长度,2.0版忽略它 char FAR * lpVendorInfo;/ 预留字段。2.0版忽略它 WSADATA, FAR * LPWSADATA;,(3) WSAStartup()应用实例 WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 1, 2 ); err = WSAStartup( wVersionRequested, ,2. socket() (1)作用:创建套接字 (2)声明: SOCKET socket ( int af, /协议的地址家族。对TCP/IP协议,该参数为AF_INET int type, /协议的套接字类型。有 /SOCK_STREAM,SOCK_DGRAM,SOCK_RAW 3种, /对1.1版本,只支持前两种。 int protocol /协议。一般设为0 ); 若失败,则返回INVALID_SOCKET,成功则返回一个新建的套接字句柄。 例如:创建一个TCP套接字 SOCKET s=socket(AF_INET,SOCK_STREAM,0); 注:在重叠I/O模型中,介绍WSASocket(),3. bind() (1)作用:将套接字绑定到一个已知地址。 (2)声明: int bind ( SOCKET s, / 套接字 const struct sockaddr FAR *name, /地址 int namelen /SOCKADDR结构长度 ); 若调用成功,则返回0。否则返回SOCKET_ERROR。 若不关心地址,则可设为INADDR_ANY(可使用任意网络接口),或将端口号设为0(自动分配一个10245000之间的唯一端口号)。,(3)bind()应用实例 SOCKET s; struct sockaddr_in servAddr; int nServPort=5500; int nErrCode; /定义服务器地址 servAddr.sin_family=AF_INET: servAddr.sin_addr.S_addr=htonl(INADDR_ANY); servAddr.sin_port=htons(nServPort); /绑定套接字 nErrCode=bind(s,(SOCKADDR*) If (SOCKET_ERROR=nErrCode)/fail/,补充:Inet_addr和Inet_ntoa函数 INADDR_ANY的功能说明。 若只是想用其中一个IP地址,则利用函数Inet_addr,将点分十进制表示的IP地址转为适合分配给S_addr的u_long类型。 unsigned long inet_addr ( const char FAR * cp ); Inet_ntoa函数完成相反的转换。 char FAR * inet_ntoa ( struct in_addr in );,4. listen() (1)作用:将套接字设置为监听模式 (2)声明: int listen( SOCKET s; /套接字 int backlog;/指定等待连接的 / 最大队列长度 ); 若调用成功,则返回0。否则返回SOCKET_ERROR。 例如:若backlog=3,有4个请求,则前3个放入队列,第4个连接会造成WSAECONNREFUSED错误。请求被服务器接收后,会被自动从队列删除。,(3)listen()用法示例 SOCKET s; int nErrCode; /监听/ nErrCode=listen(s,3); if(SOCKET_ERROR=nErrCode) /fail/,5. accept()函数 (1)作用:接受一个连接请求。 (2)声明: SOCKET accept( SOCKET s, struct sockaddr FAR* addr, /返回请求连接主机的地址out int FAR* addrlen /返回请求连接主机的地址长度out ) 返回一个新的套接字句柄。而监听套接字仍然用于接收客户端的连接。,(3)accept()应用示例 SOCKET sListen; SOCKET sAccept; sockaddr_in addrClient; int addrClientlen=sizeof(addrClient); /接收客户端/ sAccept=accept(sListen,(SOCKADDR*) If(INVALID_SOCKET=sAccept)/fail/,6. Recv()函数 (1)作用:接收数据 (2)声明: int recv ( SOCKET s, char FAR* buf, int len, int flags ); 说明:s: 套接字in buf:接收数据缓冲区out len:缓冲区长度in flags: 该参数影响该函数行为,设为0 若成功,返回值为接收的字节数。若失败则返回SOCKET_ERROR。,(3)recv()用法示例 SOCKET s; char buf128; int nReadLen; /接收数据 nReadLen=recv(s,buf,128,0); if (SOCKET_ERROR=nReadLen) /fail/ 注:在重叠I/O模式中,介绍WSARecv(),7. send() (1)作用:发送数据 (2)声明: int send ( SOCKET s, const char FAR * buf, int len, int flags ); 说明:s: 套接字in buf:发送数据缓冲区in len:缓冲区长度in flags: 该参数影响该函数行为,设为0in 若成功,返回值为发送的字节数。若失败则返回SOCKET_ERROR。,(3)send()应用示例 SOCKET s; char buf128; int retVal; strcpy(buf,”send data”); /发送数据/ retVal=send(s,buf,strlen(buf),0); if(SOCKET_ERROR=retVal) /fail/,8. closesocket() (1)作用:关闭套接字,释放资源。 (2)声明: int closesocket ( SOCKET s );,9. shutdown() (1)作用:使Socket不能发送或接收数据。 (2)声明: int shutdown ( SOCKET s, int how ); 说明:how:若为SD_RECEIVE 不接收 SD_SEND 不能发送 SD_BOTH 不能收发,10. connect() (1)作用:连接服务器。 (2)声明: int connect ( SOCKET s, const struct sockaddr FAR* name, int namelen ); 说明:name: 服务器地址 namelen: sockaddr结构的长度 若调用成功返回0,否则返回SOCKET_ERROR,(3)Connect()使用示例 SOCKET s; u_long ulSevIP; /服务器IP u_short usSevPort; /服务器端口 int retVal; /服务器地址 SOCKADDR_IN servAddr; servAddr.sin_family=AF_INET: servAddr.sin_addr.S_addr=htonl(INADDR_ANY); servAddr.sin_port=htons(nServPort); Int nServLen=sizeof(servAddr); /连接服务器 retVal=connect(s,(LPSOCKADDR) if(SOCKET_ERROR=retVal) /fail/,TCP 示例程序(P32),上机内容: 1 创建VC控制台程序 2 创建服务器端程序 3 创建客户端程序,TCP 示例程序(P32),上机内容: 1 创建VC控制台程序 2 创建服务器端程序 3 创建客户端程序,4 基本UDP套接字编程及示例程序,服务器端 初始化: WSAStartup() 创建套接字 绑定: bind() 监听: listen() 接受连接: accept() 收发数据 sendto() 关闭closesocket() WSAStartup(),客户端 初始化:WSAStartup() 创建套接字 连接: connect() 收发数据 recvfrom() 关闭closesocket() WSAStartup(),各函数介绍,1. recvfrom() 作用:接收数据,并返回发送数据方的地址 声明: int recvfrom ( SOCKET s, char FAR* buf, int len, int flags, struct sockaddr FAR* from, int FAR* fromlen ); 说明: buf:接收数据缓冲区out len:接收数据缓冲区大小in flags:一般设为0in from:返回发送数据方的主机地址out fromlen:地址长度in/out 若调用成功,返回接收数据的字节数。否则SOCKET_ERROR,2. sendto() 作用:发送数据 声明: int sendto ( SOCKET s, const char FAR * buf, int len, int flags, const struct sockaddr FAR * to, int tolen ); 说明:in buf: 发送缓冲区 len: 发送缓冲区大小 flags: 设为0 to: 接收数据的地址 tolen: 地址长度 若调用成功,则返回发送数据的字节数,否则返回SOCKET_ERROR,UDP 示例程序(p38),上机内容 1 创建服务器端程序 2 创建客户端程序,5 套接字选项,目的:不仅返回套接字信息,而且通过设置该选项影响套接字的行为。 方法: 1 getsockopt()返回套接字选项信息 2 setsockopt()设置套接字选项,1. getsockopt()函数介绍 声明: int getsockopt ( SOCKET s, int level, int optname, char FAR*

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论