一、EWOULDBLOCK
EWOULDBLOCK表示的是:进行异步socket操作时,比如connect、recv、send等操作时,由于异步操作当时没有完成,而返回的一种状态。此状态并不是表示当前操作失败,而是表示该操作正处于进行中。
二、不同编译平台中的实现
VC6平台下,EWOULDBLOCK的值是10035L,与WSAEWOULDBLOCK的值相同;
VS2010下,在errno.h中重新定义EWOULDBLOCK为140L;
这样导致的问题,会有可能使得socket操作对返回值判断失误。见如下代码:
int ret = ::connect(...);
if (ret < 0 && ret != EWOULDBLOCK)
{
printf("error!");
}
分析上述代码,会发现,这段代码在vc6下面会运行正常,但到了vs2010下面,任何时候,connect操作都会失败。
在一些流行的中间件或者基础库中,如ACE等,在vs2010下,都存在这个问题。
三、解决方法
想法将EWOULDBLOCK的值定义为10035L,比如undef errno.h中的EWOULDBLOCK定义等。这种修正方法的优点是,不需要改动过多代码实现。
阅读(3819) | 评论(0) | 转发(0) |