XP sp2对socket函数的影响

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

使用socket开发 的网络应用系统,在XP上运行的一向很好。现在移到新的机器上,新机器XP升级到sp2上,结果网络应用系统的服务器程序频繁出错,很奇怪。

后来经过跟踪发现,在新的环境中,recv函数发生了错误,虽然recv函数是阻塞的,但新的MSDN上说,recv及send函数在一些情况下会立即返回,并设置错误为WSAEWOULDBLOCK.。

下面是Microsoft的MSDN的 WSAAsyncSelect API中说明:

As in the case of the

select function,

WSAAsyncSelect will frequently be used to determine when a data transfer operation (send or

recv)

can be issued with the expectation of immediate success. Nevertheless,

a robust application must be prepared for the possibility that it can

receive a message and issue a Windows Sockets 2 call that returns WSAEWOULDBLOCK immediately. For example, the following sequence of events is possible:

Data arrives on socket s; Windows Sockets 2 posts

WSAAsyncSelect messageApplication processes some other messageWhile processing, application issues an ioctlsocket(s, FIONREAD...) and notices that there is data ready to be readApplication issues a recv(s,...) to read the dataApplication loops to process next message, eventually reaching the

WSAAsyncSelect message indicating that data is ready to readApplication issues recv(s,...), which fails with the error WSAEWOULDBLOCK.

Other sequences are also possible.

The WS2_32.DLL will not continually flood an application with

messages for a particular network event. Having successfully posted

notification of a particular event to an application window, no further

message(s) for that network event will be posted to the application

window until the application makes the function call that implicitly

reenables notification of that network event.

所以在网络应用中要检查是否错误并且是WSAEWOULDBLOCK,并进行相关处理。但在sp2之前居然都能正常使用。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航