WinSo毫帝ck是一个基轮于Socket模型的API,在Microsoft Window来自s操作系统类中使用。
- 中文名 WinSock API
- 属 性 函数接口
- 分 类 阻塞函数,非阻塞函数
- 所属领域 计算机编程
简介
诗间艺 Socket接口是网络编程(通常是TCP/IP协议,也可以是其他协议)的API。率种余缺旧宗主仅最早的Socket接口是Ber展植跳际占标keley接口,在Un见ix操作系统中实现。WinSock也是一个基于Socket模型的API,在Microsoft Windows来自操作系统类中使用。它在Berkeley接口函数的基础之上,还增加了基于消息驱动机制的Windows扩展函数。Winscok1.1只支持TCP/IP网络,WinSock2.0己盟命伤击较众波问无增加了对更多协议的支持。这里,讨论TCP/IP网络上的API。
接口函数
第一类是WinSock A西准钱PI包含的Berkeley socket函数。这类函数分两部分。第一部分是用于网络I/O的函数,如
accept、closesocket、connect、recv、recvfrom、select、sen360百科d、sendto
另一部分是不涉及网络I/O、在本地端完成的函数,如
bind、getpeername、getsockname、getsocke绍油似移层来歌劳topt、htonl、htons、inet_addr、inet_nton
ioctlsocket、listen、nt善初径纸兴王养ohl、ntohs、sets红界殖管劳项办责沉ocketopt、shutdown、socket等
第二类是检索有关域名、通信服务和诗协议等Internet信息的数据库函数,如
gethostbyaddr、gethostbyname、gethostname看、getprotolbyname
getprotolbynu核资念生慢件酒mber、getserverbyname、getservbyport。
第三类烈延含值非因是Berkekley socket例程的Windows专用的扩展函数,如它句称们派本美gethostbyname对应的WSAAsynGetHostByName(其他数据库函数除了gethostname都有异步版本),select汉陈步对应的WSAAsynSelect,判断是否阻塞的函数WSAIsBlocking,得到上一次Windsock 企充乱API错误信息的WSAGetLastError,等等。
函数分类
从另外一个角度,这些函数又可以分为两类,一是阻塞函数,一是非阻塞函数。
所谓阻塞函数,是指其完成指定的任务之来自前不允许程序调用另一个函数,在Windows下还会阻塞本线程消息的发送。父顾所谓非阻塞函数,是指360百科操作启动之后,如果可以立即得到结果就返回结果,否则返回表示结果需要等待的错误信息,不等待任务完成函数就返回。
式后液达抗究排低构情角首先,异步函数是非阻塞函数;
其次,获取远地信息的数据库函数是阻塞函数(因此,W视inSock提供了其异步版本不划卷);
在Berkeley so宪号担仅搞自谁马绝远cket函数部分中,不涉及网络I/O、本地端末兴待工作的函数是非阻塞函数;
在Berke苏ley socket函数部分中,网络I/O的函数是可阻塞函数,也就是它们可以阻塞执行,也可以不阻塞执行。这些函数都使用了一个socket,如果它们使用的socket是阻塞的,则这些函数是阻塞函数;如果它们使用的socket是非阻塞的,则这些函数是非阻塞函数。
参数设定
创建一个socket时,可以指定它是否阻塞。在缺省情况下,Berkerley的Socket函数和WinSock都创建"阻塞"的socket。阻塞socket通过使用select函数或者WSAAsynSelect函数在指定操作下械善械笔叶变成非阻塞的。WSAAsyncSe频超往顶lect函数原型如下。
in丝销评王慢t WSAAsyncSelect(
SOCKET s,
HWND hWnd,
u得增回万小杀诉放_int wMsg,
long lEvent
);
其中,参数1指定了要操作的sock最映红马略顶补饭伯et句柄;参数2指定了一个窗口句柄;参数3指定了一个消息,参数4指定了网络事件,可以是多个事件的组联头强推件合,如:
FD_READ 准备读
FD_WRIT之换正错的差县础手套每E 准备写
FD_OOB 带外数据到达
FD_ACC载脚攻你者口绍EPT 收到连接
扩名信磁 FD_CONNECT 差还完成连接
FD_C油新没如都LOSE 关闭socket。
用OR操作组合这些事件值,如FD_READ|FD_WRITE
WSAAsyncSelect函数表示对socket s监测lEvent指定的网络事件,如果有事件发生,则给窗口hWnd发送消息wMsg。
假定应用程序的一个socket s指定了监测FD_READ事件,则在FD_READ事件上变成非阻塞的。当read函数被调用时,不管是否读到数据都马上返回,如果返回一个错误信息表示还在等待,则在等待的数据到达后,消息wMsg发送给窗口hWnd,应用程序处理该消息读取网络数据。
对于异步函数的调用,以类似的过程最终得到结果数据。以gethostbyname的异步版本的使用为例进行说明。该函数原型如下:
HANDLE WSAAsyncGetHostByName(
HWND hWnd,
u_int wMsg,
const char FAR *name,
char FAR *buf,
int buflen
);
在调用WSAAsyncGetHostByName启动操作时,不仅指定主机名字name,还指定了一个窗口句柄hWnd,一个消息ID wMsg,一个缓冲区及其长度。如果不能立即得到主机地址,则返回一个错误信息表示还在等待。当要的数据到达时,WinSock DLL给窗口hWnd发送消息wMsg告知得到了主机地址,窗口过程从指定的缓冲区buf得到主机地址。
使用异步函数或者非阻塞的socket,主要是为了不阻塞本线程的执行。在多进程或者多线程的情况下,可以使用两个线程通过同步手段来完成异步函数或者非阻塞函数的功能。