Winsock基础Word格式文档下载.docx
- 文档编号:16129803
- 上传时间:2022-11-20
- 格式:DOCX
- 页数:26
- 大小:38.10KB
Winsock基础Word格式文档下载.docx
《Winsock基础Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《Winsock基础Word格式文档下载.docx(26页珍藏版)》请在冰豆网上搜索。
wVersionRequested的正确值。
lpWSAData参数是指向LPWSADATA结构的指针,WSAStartup其加载的库版本有关的信息填在这个结构中:
typedefstructWSAData
{WORDwVersion;
WORDwHighVersion;
charszDescription[WSADESCRIPTION_LEN+1];
charsaSystemStatus[WSASYS_STATUS_LEN+1];
unsighdshortiMaxSockets;
unsighdshortiMaxUdpDg;
charFAR*lpVendorInfo;
}WSADATA,FAR*LPWSADATA;
WSAStartup把第一个字段wVersion设成打算使用的Winsock版本。
wHighVersion参数容纳的是现有的Winsock库的最高版本。
记住,这两个字段中,高位字节代表的是Winsock副版
本,而低位字段代表的则是Winsock主版本。
szDescription和szSystemStatus这两个字段由特定的Winsock实施方案设定,事实上没有用。
不要使用下面这两个字段:
iMaxSockets和iMaxUdpDg,它们是假定的同时最多可打开多少套接字和数据报的最大
长度。
然而,要知道数据报的最大长度应该通过WSAEnumProtocols来查询协议信息。
同时最多打开套接字的数目不是
固定的,很大程度上和可用物理内存的多少有关。
lpVendorInfo字段是为Winsock实施方案有关的指定厂商信息预留的。
任何一个Win32平台上都没有使用这个字段。
7.2错误检查和控制
对编写成功的Winsock应用程序而言,错误检查和控制是至关重要的,因此,我们打算先为大家介绍错误检查和控制。
事实
上,对Winsock函数来说,返回错误是非常常见的。
但是,多数情况下,这些错误都是无关紧要的,通信仍可在套接字上进
行。
尽管其返回的值并非一成不变,但不成功的Winsock调用返回的最常见的值是SOCKET_ERROR。
实际上,
SOCKET_ERROR常量是-1。
如果调用一个Winsock函数,错误情况发生了,就可用WSAGetLastError
函数来获得一段代码,这段代码明确地表明发生的状况。
该函数的定义如下:
intWSAGetLastError(void);
发生错误之后调用这个函数,就会返回所发生的特定错误的完整代码。
WSAGetLastError函数返回的这些错误都已预定义
常量值,为各种错误代码定义的常量(带有#定义指令)一般都以WSAE开头。
7.3面向连接的协议
对服务器监听的连接来说,它必须在一个已知的名字上。
在TCP/IP中,这个名字就是本地接口的IP地址,加上一个端口编
号。
每种协议都有一套不同的定址方案,所以有一种不同的命名方法。
在Winsock中,第一步是将指定协议的套接字绑定到它已
知的名字上。
这个过程是通过API调用bind来完成的。
下一步是将套接字置为监听模式。
这时,用API函数listen来完成
的。
最后,若一个客户机试图建立连接,服务器必须通过accept或WSAAccept调用来接受连接。
1.bind
一旦为某种特定协议创建了套接字,就必须将套接字绑定到一个已知地址。
bind函数可将指定的套接字同一个已知地址绑定
到一起。
该函数声明如下;
intbind(SOCKETs,conststurctsockaddrFAR*name,intnamelen);
其中,第一个参数s代表我们希望在上面等待客户机连接的那个套接字。
第二个参数的类型是structsockaddr,它的作用很简单,就是一个普通的缓冲区。
针对自己打算使用的那个协议,必须把该参数
实际地填充一个地址缓冲区,并在调用bind时将其造型为一个structsockaddr。
举个例子来说,下列代码阐述了在一个TCP连接上,如何来做到这一点:
SOCKETs;
structsockaddr_intcpaddr;
intport=5150;
s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
tcpaddr.sin_family=AF_INET;
tcpaddr.sin_port=htons(port);
tcpaddr.sin_addr.s_addr=htonl(INADDR_ANY);
bind(s,(SOCKADDR*)&
tcpaddr,sizeof(tcpaddr));
一旦出错,bind就会返回SOCKET_ERROR。
对bind来说,最常见的错误是WSAEADDRINUSE。
如使用的
是TCP/IP,那么WSAEADDRINUSE就表示另一个进程已经同本地IP接口和端口号绑定到了一起,或者那个IP接口
和端口号处于TIME_WAIT状态。
假如你针对一个套接字调用bind,但那个套接字已经绑定,便会返回WSAEFFAULT
错误。
2.listen
我们接下来要做的是将套接字置入监听模式。
bind函数的作用只是将一个套接字和一个指定的地址关联在一起。
指示一个套接
字等候进入连接的API函数则是listen,其定义如下:
intlisten(SOCKETs,intbacklog);
第一个参数同样是限定套接字。
backlog参数指定了正在等待连接的最大队列长度。
这个参数非常重要,因为完全可能同时出现几个服务器连接请求。
例如,假定backlog参数为2。
如果三个客户机同时发出请求,那么头两个会被放在一个“待决”(等待处理)队列中,以便应
用程序依次为它们提供服务。
而第三个连接会造成一个WSAECONNREFUSED错误。
注意,一旦服务器接受了一个连接,
那个连接请求就会从队列中删去,以便别人可继续发出请求。
backlog参数其实本身就存在着限制,这个限制是由基层的协议
提供者决定的。
如果出现非法值,那么会用与之最接近的一个合法值来取代。
除此以外,对于如何知道实际的backlog值,
其实并不存在一种标准手段。
与listen对应的错误是非常直观的。
到目前为止,最常见的错误是WSAEINVAL。
该错误通常意味着,你忘记在listen
之前调用bind。
否则,与bind调用相反,使用listen时可能收到WSAEADDRINUSE。
这个错误通常是在进行bind
调用时发生的。
3.accept和WSAAccept
现在,我们已做好了接受客户连接的准备。
这是通过accept或WSAAccept函数来完成的。
accept格式如下:
SOCKETaccept(SOCKETs,structsockaddrFAR*addr,intFAR*addrlen);
其中,参数s是一个限定套接字,它处在监听模式。
第二个参数应该是一个有效的SOCKADDR_IN结构的地址,而addrlen应该是SOCKADDR_IN结构的长度。
对于
属于另一种协议的套接字,应当用与那种协议对应的SOCKADDR结构来替换SOCKADDR_IN。
通过对accpet函数
的调用,可为待决连接队列中的第一个连接请求提供服务。
accept函数返回后,
addr结构中会包含发出连接请求的那个客户机的IP地址信息,而addrlen参数则指出结构的长度。
此外,accept会返回
一个新的套接字描述符,它对应于已经接受的那个客户机连接。
对于该客户机后续的所有操作,都应使用这个新套接字。
至于原
来那个监听套接字,它仍然用于接受其他客户机连接,而且仍处于监听模式。
Winsock2引入了一个名为WSAAccept的函数。
它能根据一个条件函数的返回值,选择性地接受一个连接。
这个新函数的定
义如下:
SOCKETWSAAccept(SOCKETs,structsockaddrFAR*addr,LPINTaddlen,
LPCONDITIONPROClpfnCondition,DWORDdwCallbackData);
其中,头三个参数与accept的Winsock1版本是相同的。
lpfnCondition参数是指向一个函数的指针,那个函数是根据客户请求来调用的。
该函数决定是否接受客户的连接请求,定义如下:
intCALLBACKConditionFunc(LPWSABUFlpCallerId,LPWSABUFlpCallerData,
LPQOSlpSQOS,LPQOSlpGQOS,
LPWSABUFlpCalleeId,LPWSABUFlpCalleeData,
GROUPFAR*g,DWORDdwCallbackData);
lpCallerId是一个值参数,其中包含连接实体的地址。
WSABUF结构是许多Winsock2函数常用的。
对它的声明如下:
typedefstruct__WSABUF{
u_longlen;
charFAR*buf;
}WSABUF,FAR
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Winsock 基础