第11章Winsock主要函数及其用法.ppt_第1页
第11章Winsock主要函数及其用法.ppt_第2页
第11章Winsock主要函数及其用法.ppt_第3页
第11章Winsock主要函数及其用法.ppt_第4页
第11章Winsock主要函数及其用法.ppt_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

1、第1页,人民邮电出版社,第11章 Winsock主要函数及其用法,第2页,11.1数据格式转换函数,11.1.1htonl()和WSAHtonl() 这两个函数的功能是将4字节主机字节顺序的数转化为网络字节顺序。 在Winsock 1中提供的格式是: u_long htonl( u_long hostlong ); 在Winsock 2中提供的扩展格式是: int WSAHtonl( SOCKET s, u_long hostlong, u_long FAR * lpnetlong );,第3页,11.1数据格式转换函数,11.1.2htons()和WSAHtons() 这两个函数的功能是将2

2、字节主机字节顺序的数转化为网络字节顺序。 在Winsock 1中提供的格式是: u_short htons( u_short hostshort ); 在Winsock 2中提供的扩展格式是: u_short WSAHtons( SOCKET s, u_short hostshort, u_short FAR * lpnetshort );,第4页,11.1数据格式转换函数,11.1.3ntohl()和WSANtohl() 这两个函数的功能是将4字节网络字节顺序的数转化为主机字节顺序。 在Winsock 1中提供的格式是: u_long ntohl( u_long netlong ); 在Wi

3、nsock 2中提供的扩展格式是: u_long WSANtohl( SOCKET s, u_long netlong, u_long FAR * lphostlong );,第5页,11.1数据格式转换函数,10.1.4ntohs()和WSANtohs() 这两个函数的功能是将2字节网络字节顺序的数转化为主机字节顺序。 在Winsock 1中提供的格式是: u_short ntohs( u_short netshort ); 在Winsock 2中提供的扩展格式是: u_short WSANtohs( SOCKET s, u_short netshort, u_short FAR * lph

4、ostshort );,第6页,11.2 IP地址转换函数及其应用,11.2.1inet_addr() 该函数的功能是将点分十进制数表示的IP地址转换为网络字节顺序的IP地址。 unsigned long inet_addr( const char FAR* cp );,第7页,11.2 IP地址转换函数及其应用,11.2.2inet_ntoa() 该函数的功能是将网络字节顺序的IP地址转换为点分十进制数表示的IP地址。 char *inet_ntoa( struct in_addr in );,第8页,11.3 网络信息获取函数及其应用,11.3.1获得主机名gethostname() 用来

5、取得一台主机的名称信息。 int gethostname( char FAR* name, int namelen );,第9页,11.3 网络信息获取函数及其应用,11.3.2获得与套接口相连的远程协议地址getpeername() int getpeername( SOCKET s, struct sockaddr FAR* name, int FAR* namelen );,第10页,11.3 网络信息获取函数及其应用,11.3.3获得套接口本地协议地址getsockname() int getsockname( SOCKET s, struct sockaddr FAR* name,

6、int FAR* namelen );,第11页,11.3 网络信息获取函数及其应用,11.3.4根据主机名取得主机信息gethostbyname()和WSAAsyncGetHostByName() gethostbyname()和WSAAsynGetHostByName()这两个Winsock API函数从主机数据库中取回与指定的主机名对应的主机信息。两个函数均返回一个hostent结构型的量,所以先介绍一下该结构的格式。hostent结构的定义如下: struct hostent char FAR * h_name; /* official name of host */ char FAR

7、 * FAR * h_aliases; /* alias list */ short h_addrtype; /* host address type */ short h_length; /* length of address */ char FAR * FAR * h_addr_list; /* list of addresses */ #define h_addr h_addr_list0 /* address, for backward compat */ ;,第12页,11.3 网络信息获取函数及其应用,11.3.5根据主机地址取得主机信息gethostbyaddr()和WSAAs

8、yncGetHostByAddr() 这两个函数可以根据主机的IP地址取得主机名和主机地址等信息。 在Winsock 1中提供的格式是: struct hostent FAR *gethostbyaddr( const char FAR* addr, int len, int type );,第13页,11.3 网络信息获取函数及其应用,11.3.6根据协议名取得主机协议信息getprotobyname()和WSAAsyncGetProtoByName() 这两个函数可以根据协议名称返回对应的相关协议信息。它们都要使用到一个与协议有关的结构,该结构的定义如下: struct protoent

9、charFAR* p_name; charFAR* FAR * p_aliases; short p_proto; ;,第14页,11.3 网络信息获取函数及其应用,11.3.7根据协议号取得主机协议信息getprotobynumber()和WSAAsyncGetProtoByNumber() 返回对应于给定协议号的相关协议信息。 在Winsock 1中提供的格式是: struct protoent FAR *getprotobynumber( int number ); 在Winsock 1中提供的异步扩展格式是: HANDLE WSAAsyncGetProtoByNumber( HWND

10、hWnd, unsigned int wMsg, int number, char FAR * buf, int buflen );,第15页,11.3 网络信息获取函数及其应用,11.3.8根据服务名取得相关服务信息getservbyname()和WSAAsyncGetServByName() 返回对应于给定服务名和协议名的相关服务信息。这两个函数要用到一个如下所示的结构: struct servent char FAR* s_name; char FAR* FAR* s_aliases; short s_port; char FAR * s_proto; ;,第16页,11.3 网络信息获

11、取函数及其应用,11.3.9根据端口号取得相关服务信息getservbyport()和WSAAsyncGetServByPort() 返回对应于给定端口号和协议名的相关服务信息。 在Winsock 1中提供的格式是: struct servent FAR *getservbyport( int port, const char FAR *proto );,第17页,11.3 网络信息获取函数及其应用,11.3.10网络信息获取函数应用实例 以上介绍的网络信息获取函数,本小节举一个实例来说明这些函数的用法。本实例只使用了三个比较典型的函数,其他函数的用法与它们的用法类似。要说明的是虽然这只是一个

12、关于网络信息获取函数用法的实例,但该程序也是一个非常有用的实用程序,它可以获得一台主机的主机名、主机别名(如果有的话)、主机IP地址列表等信息。,第18页,11.4 套接口选项函数及其应用,11.4.1套接口选项函数说明 套接口选项获取函数getsockopt(): int setsockopt( SOCKET s, int level, int optname, const char FAR* optval, int optlen );,第19页,11.4 套接口选项函数及其应用,11.4.1套接口选项函数说明 套接口选项设置函数setsockopt(): int getsockopt( S

13、OCKET s, int level, int optname, char FAR* optval, int FAR* optlen );,第20页,11.4 套接口选项函数及其应用,11.4.2SOL_SOCKET选项级别 SOL_SOCKET级别的选项主要针对传输层协议(TCP或UDP)。 在SOL_SOCKET选项级别下,套接口的选项有两种类型:一种是值为布尔型的选项,这种选项可以允许或禁止一种特性;另一种是值为整型或结构型的选项,这种选项可以用来设置系统工作时的某些参数等内容。 允许一个布尔型选项,则将optval指向一个非零的整型数;禁止一个布尔型选项,可以将optval指向一个等于

14、零的整型数。对于布尔型选项,optlen应等于sizeof(int)。对于非布尔型的其他选项,optval应该指向包含所需选项的整型量或结构量,而optlen则为整形量或结构量的长度。 还要注意一个问题,套接口的有些属性值既可以设置(即可以使用setsockopt()函数)也可以获取(即使用getsockopt()函数),但有些套接口属性只能获取或只能设置。,第21页,11.4 套接口选项函数及其应用,11.4.3IPPROTO_IP选项级别 IPPROTO_IP这一级别的套接口选项是针对网络层协议的,即IPv4协议,所以这些选项字段均以IP开头。这些选项字段的声明大都放在Winsock.h和

15、Winsock2.h这两个头文件内。,第22页,11.4 套接口选项函数及其应用,11.4.4IPPROTO_TCP选项级别 该选项是针对TCP协议的。在Winsock中仅有一个IPPROTO_TCP级别的选项,即TCP_NODELAY选项,该选项用来打开或关闭Nagle算法。如果该选项的值为TRUE,就会在对应的套接口上禁止使用Nagle算法。但在系统默认情况下Nagle算法是打开的,该选项只适用于流式套接口(SOCK_STREAM),其地址族为AF_INET。这个选项可用在所有Winsock版本上,并得到了所有Win 32平台的支持。,第23页,11.4 套接口选项函数及其应用,11.4.

16、4IPPROTO_TCP选项级别 Nagle算法通过将未确认的数据存入缓冲区直到蓄足一个包后一起发送的方法,这样做的好处是可以减少主机发送的零碎小数据包的数目,以减少网络通信的开销,提高系统的吞吐量。但对于某些应用来说,这种算法将降低系统性能,例如交互性较强的Telnet应用程序,用户可通过它登录至一台远程机器,然后向其传送命令。通常,用户每秒钟只会进行少量的键击,若Nagle算法在起作用,便会造成响应的迟钝,甚至造成对方主机不予应答的错觉。所以TCP_NODELAY选项可用来将此算法关闭,以适应交互性较强的一些应用程序。应用程序编写者只有在确切了解它的效果并在确实需要的情况下,才可设置TCP

17、_NODELAY选项,因为在一般的应用中如果设置该选项,则对网络性能有明显的负面影响。,第24页,11.4 套接口选项函数及其应用,11.4.5套接口属性设置和获取实例 在该实例程序中,使用getsockopt()函数来获取套接口的类型、接收缓冲和发送缓冲的大小。然后使用setsockopt()函数对套接口接收缓冲进行了重新设置,并用getsockopt()函数获取了重新设置以后的大小。,第25页,11.5 套接口I/O处理函数及其应用,11.5.1阻塞与非阻塞通信方式 在Windows环境下,套接口的通信方式分为两种:阻塞方式和非阻塞方式。因此,在编写网络应用程序时,就要对套接口的工作方式做

18、出选择。这就要首先明白套接口阻塞方式和非阻塞方式的工作特点。 阻塞方式下工作的套接口,在进行I/O操作时,函数要等待到相关操作完成以后才能返回(或者可以使用WSACancelBlockingCall()调用唤起一个阻塞的操作)。由于完成一个操作需要的时间可能长,也可能短,假如操作完成需要较长的时间,那么就会出现为了完成某一个操作,要耗费处理机较长的时间,显然这在这种情况对提高处理机的利用率是不利的。例如一个设置为阻塞的套接口,在执行send()操作时,如果套接口上的发送缓冲区没有可用的空间来存放要发送的用户数据时,应用程序就一直阻塞等待,直到有可用的缓冲区空间为止。同样在执行一个recv()操

19、作时,如果接收缓冲没有数据可取,这个函数就会一直处于阻塞等待状态,直到收到对方发送的数据为止。,第26页,11.5 套接口I/O处理函数及其应用,11.5.1阻塞与非阻塞通信方式 非阻塞方式下工作的套接口,在进行I/O操作时,无论操作是否成功,调用都会立即返回。例如一个设置为非阻塞方式的套接口,在执行send()操作时,无论套接口上的发送缓冲区有没有可用的空间都会立即返回,无需等待。但在大多数情况下,这些调用都会“失败”,并返回一个WSAEWOULDBLOCK错误,该错误说明请求的操作在调用期间没有完成。 阻塞方式和非阻塞方式的套接口各有其优点和缺点。阻塞方式的套接口编程简单,易于实现。正因为

20、如此,一个套接口的默认操作模式被设置为阻塞方式,如果要使套接口工作在非阻塞方式下,就要使用ioctlsocket()调用进行设置。但阻塞方式的套接口在下面几种情况下会显得难于管理: 当有多个已建立连接的套接口需要进行管理时; 当发送的数据量不均匀或接收的数据量不均匀时; 当发送或接收的数据时间不确定时。,第27页,11.5 套接口I/O处理函数及其应用,11.5.2设置套接口的工作方式ioctlsocket()和WSAIoctl() int ioctlsocket( SOCKET s, long cmd, u_long FAR* argp );,第28页,11.5 套接口I/O处理函数及其应用

21、,11.5.3套接口I/O状态查询select() 前面我们已经讨论过,一个套接口创建好以后,在进行I/O操作时处于阻塞状态。在使用send()或recv()等函数进行I/O操作时,进程或线程被迫进入“阻塞”状态进行等待,直到这些操作可以正常完成。使用select()函数的好处是在进行I/O操作之前,可以首先判断能否向一个套接口写入数据,或者套接口上是否存在可读的数据。这样就可以防止应用程序在套接口处于阻塞模式时,对它进行的I/O操作被迫进入等待状态,同时也可以防止在套接口处于非阻塞模式时,产生WSAEWOULDBLOCK错误。 int select( int nfds, fd_set FAR

22、* readfds, fd_set FAR* writefds, fd_set FAR* exceptfds, const struct timeval FAR* timeout );,第29页,11.5 套接口I/O处理函数及其应用,11.5.4异步事件通知WSAAsyncSelect() WSAAsyncSelect()是Winsock提供的一个适合于Windows编程使用的方法。它允许在一个套接口上当发生特定的网络事件时,给Windows网络应用程序(窗口或对话框)发送一个消息(事件通知)。 int WSAAsyncSelect( SOCKET s, HWND hWnd, unsigne

23、d int wMsg, long lEvent );,第30页,11.5 套接口I/O处理函数及其应用,11.5.5取消正在执行的阻塞调用WSACancelBlockingCall() 如果在应用程序中,想取消正在执行的阻塞调用,就要使用该函数。要注意的是在WinSock 2的实现规范中已经不包括该函数。 int WSACancelBlockingCall( void );,第31页,11.5 套接口I/O处理函数及其应用,11.5.6判断是否有阻塞调用WSAIsBlocking() 该函数非常简单,用于判断是否有阻塞调用正在进行。 BOOL WSAIsBlocking ( void );,第

24、32页,11.5 套接口I/O处理函数及其应用,11.5.7取消未完成的一个异步操作WSACancelAsyncRequest() 该函数用于取消一个未完成的异步操作。 int WSACancelAsyncRequest( HANDLE hAsyncTaskHandle );,第33页,11.6事件对象I/O管理及其应用,11.6.1创建事件对象WSACreateEvent() 该函数的格式如下: WSAEVENT WSACreateEvent( void ); 调用该函数不需要传入参数。函数的返回值也很简单,如果调用成功,就是一个创建好的事件对象句柄。如果调用失败,则返回WSA_INVALI

25、D_EVENT。应用程序可通过调用WSAGetLastError()函数获取如下的错误信息: WSANOTINITIALISED:在调用本API之前应成功调用WSAStartup()。 WSAENETDOWN:网络子系统失效。 WSA_NOT_ENOUGH_MEMORY:没有足够的内存创建事件对象。,第34页,11.6事件对象I/O管理及其应用,11.6.2网络事件注册WSAEventSelect() 事件对象创建成功之后,就要将其与某个特定的套接口关联在一起,同时与使用WSAAsyncSelect()函数类似,要注册自己感兴趣的网络事件(具体可以使用的网络事件与WSAAsyncSelect(

26、)是一样的)。完成这些工作就要调用WSAEventSelect()函数。 int WSAEventSelect ( SOCKET s, WSAEVENT hEventObject, long lNetworkEvents );,第35页,11.6事件对象I/O管理及其应用,11.6.3事件对象状态复位WSAResetEvent() 为WSAEventSelect()函数创建的网络事件对象有“signaled”和“nonsignaled”两种工作状态,分别表示“已置信”和“未置信”。如果一个网络事件触发了与一个套接口关联在一起的事件对象,该对象的工作状态便会从“未置信”转变成“已置信”,所以在完

27、成了一个I/O请求的处理之后,应用程序需要负责将工作状态从“已置信”更改为“未置信”未传信。完成该功能的函数就是WSAResetEvent()。 BOOL WSAResetEvent( WSAEVENT hEvent );,第36页,11.6事件对象I/O管理及其应用,11.6.4事件对象状态置位WSASetEvent() 该函数与WSAEventSelect()函数的功能相反,它将一个事件对象的状态从“nonsignaled”转化为“signaled”。函数的格式与用法同WSAEventSelect()函数类似。其格式如下: BOOL WSASetEvent( WSAEVENT hEvent

28、 );,第37页,11.6事件对象I/O管理及其应用,11.6.5关闭事件对象WSACloseEvent() 在一个事件对象创建后进行使用,当针对事件对象的处理完成后,就应该释放一个事件句柄所占用的资源,这可以通过调用WSACloseEvent()函数来完成。 BOOL WSACloseEvent( WSAEVENT hEvent );,第38页,11.6事件对象I/O管理及其应用,11.6.6等待事件对象WSAWaitForMultipleEvents() 一个套接口通过调用WSAEventSelect()函数与一个事件对象句柄关联在一起后,就要等待网络事件触发事件对象句柄的工作状态,然后再

29、进行I/O处理工作。用来等待一个或多个事件对象句柄的函数是WSAWaitForMultipleEvents()。 DWORD WSAWaitForMultipleEvents( DWORD cEvents, const WSAEVENT FAR *lphEvents, BOOL fWaitAll, DWORD dwTimeout, BOOL fAlertable );,第39页,11.6事件对象I/O管理及其应用,11.6.7网络事件查询WSAEnumNetworkEvents() 该函数可以检测指定套接口上发生的网络事件。 int WSAEnumNetworkEvents ( SOCKET

30、s, WSAEVENT hEventObject, LPWSANETWORKEVENTS lpNetworkEvents, );,第40页,11.7 错误处理函数函数,11.7.1获得错误操作代码WSAGetLastError() 该函数已经在前面说明过,在程序中使用频率非常高。它用来获取最新的失败操作错误状态码。 int WSAGetLastError ( void ); 本函数返回最新产生的网络错误,当在使用一特定的Windows Sockets API函数指出一个错误已经发生时,接着就应调用本函数以获得对应的错误代码。,第41页,11.7 错误处理函数函数,11.7.2设置错误操作代码W

31、SASetLastError() 该函数可以设置被WSAGetLastError()函数接收的错误代码。 1.函数格式 void WSASetLastError ( int iError ); 2.函数参数说明 iError:传入参数,指明后续的WSAGetLastError()调用时,将要返回的错误代码。 3.函数应用说明 本函数没有返回值。它允许应用程序为当前线程设置错误代码,并可由后来的WSAGetLastError()调用返回该错误代码。要注意的是任何由应用程序调用的后续Windows Sockets函数都将覆盖本函数设置的错误代码。,第42页,11.8Winsock 2支持的其他函数

32、,11.8.1共享套接口WSADuplicateSocket() 为了在进程间共享套接口,Windows Sockets 2引入了WSADuplicateSocket()函数。共享套接口是通过对底层的套接口创建附加的套接口描述符来实现的。 int WSADuplicateSocket( SOCKET s, DWORD dwProcessId, LPWSAPROTOCOL_INFO lpProtocolInfo );,第43页,11.8Winsock 2支持的其他函数,11.8.2获取传送协议信息WSAEnumProtocols() Windows Sockets 2的一个重要的特征是支持多种协议。如何知道一台主机中安装了什么类型的协议,就要使用WSAEnumProtocols()函数。 int WSAEnumProtocols ( LPINT lpiProtocols, LPWSAPROTOCOL_INFO lpProtocol

温馨提示

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

最新文档

评论

0/150

提交评论