在被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进行处理。