关于ACE使用中recv和send阻塞与非阻塞的问题

在被Socket API的移植时出现的问题折磨了将近两个月后,终于决定弃用Socket API换成ACE进行网络连接了。

ACE做最简单的网络连接和数据传输,用到的最主要也是最基本的几个类是:

1、ACE_INET_Addr,用来定义需要连接的IP和端口,如:ACE_INET_Addr local_addr("10.10.10.10:1234");  或者用local_addr.set("10.10.10.10:1234");

2、ACE_SOCK_Acceptor,主要用在服务器端,用来监听客户端的连接,ACE_SOCK_Acceptor acceptor;  acceptor.open(local_addr, 1)

3、ACE_SOCK_Connector,主要用在客户端,用来连接服务器端,ACE_SOCK_Connector connector; connector.connect(peer,addr,&timeout);

4、ACE_SOCK_Stream,主要用来传输服务器和客户端间的数据流,ACE_SOCK_Stream peer; peer.recv(recvbuf, sizeof(recvbuf)); peer.send(write_buf, sizeof(write_buf));

5、ACE_Time_Value,主要用来设置网络连接相关的时间,如ACE_Time_Value timeout (10, 0);

 

ACE的recv和send默认为阻塞模式,而网络连接线程中还需要处理其他的事情,因此阻塞模式行不通,网上所说的非阻塞模式的设置都不靠谱,基本都是对ACE_Time_Value的设置,大概有以下几种模式:

1、ACE_Time_Value timeout (0, 0);

2、ACE_Time_Value timeout (0);

3、readnum = peer.recv(read_buf, REC_LEN, 1, NULL);

以上几种方法均不能实现非阻塞recv和send

最后在《C++网络编程 卷1:运用ACE和模式消除复杂性》第3.6节 “ACE_SOCK_IO类和ACE_SOCK_Stream”中找到解决方法。正确实现recv非阻塞的方式是:

 

但是注意返回的是-1,要对errno进行处理。

转载于:https://www.cnblogs.com/Meong/p/8493859.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值