Chinaunix首页 | 论坛 | 博客
  • 博客访问: 43206
  • 博文数量: 9
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 130
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-03 07:58
文章分类

全部博文(9)

文章存档

2014年(4)

2013年(5)

我的朋友

分类: C/C++

2013-08-05 22:21:57

一、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定义等。这种修正方法的优点是,不需要改动过多代码实现。

阅读(3706) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:智能指针的简单实现、用法

给主人留下些什么吧!~~