ACE_TAO 007
Posted islinyoubiao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ACE_TAO 007相关的知识,希望对你有一定的参考价值。
ACE SOCK Wrapper facader
用ACE SOCK封装来做一个简单的socket server。
代码如下:
int run_main(int argc, ACE_TCHAR *argv[])
{
//初始化服务端Socket侦听地址
ACE_INET_Addr port_to_listen(60000);
ACE_SOCK_Acceptor acceptor;
//调用Open函数对acceptor对象进行初始化,创建侦听的Socket
if(acceptor.open(port_to_listen, 1) == -1)
{
ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%p\\n"), ACE_TEXT("acceptor.open")), -1);
}
while(1)
{
//创建一个ACE_SOCK_Stream对象,用于对新建的连接进行IO操作
ACE_SOCK_Stream peer;
ACE_INET_Addr peer_addr;
//调用acceptor函数等待客户端连接
if(acceptor.accept(peer, &peer_addr) == -1)
{
ACE_DEBUG((LM_DEBUG, ACE_TEXT("acceptor error!\\n")));
}
else
{
ACE_TCHAR peer_name[MAX_HOSTNAME_LEN];
peer_addr.addr_to_string(peer_name, MAX_HOSTNAME_LEN);
ACE_DEBUG((LM_DEBUG, ACE_TEXT("connection from %s\\n"), peer_name));
char buffer[4096];
ssize_t bytes_received;
//通过peer对象进行IO操作
while((bytes_received = peer.recv(buffer, sizeof(buffer))) > 0)
{
buffer[bytes_received] = 0;
ACE_DEBUG((LM_DEBUG, ACE_TEXT("receiver data: %s\\n"), buffer));
}
peer.close();
ACE_DEBUG((LM_DEBUG, ACE_TEXT("close the socket.\\n")));
}
}
ACE_NOTREACHED(return 0);
}
其中
ACE_INET_Addr是ACE实现对Socket编程中IP地址操作的封装。
ACE_ERROR_RETURN是ACE日志模块的一个接口,用于输出错误信息,同时返回一个错误值,在示例中,返回的值是-1。其中格式符p表示根据系统的错误号输出错误信息。其他更多的格式符可以参考Log_Msg.h。ACE的日志模块功能很强大,如果正打算开发一个日志模块,其非常值得参考。
accept函数用于等待客户端连接。一旦连接成功,新连接的Socket描述符会保存在peer中,客户端地址则保存在peer_addr中。
ACE_NOTREACHED是一个宏,编译器不同,它的定义也不同,它的作用可能是为了避免编译器警告。
运行如下:
重连也是可以的,方便
receiver data: Hello this way
close the socket.
connection from 127.0.0.1:54997
close the socket.
connection from 127.0.0.1:54998
receiver data: this is very good
注意,qt的main和ACE_MAIN之间的关系
#include "ace/OS_main.h"
#if defined (ACE_HAS_WINCE)
# include "ace/ACE.h"
#endif /* ACE_HAS_WINCE */
int run_main (int argc, ACE_TCHAR *argv[]);
int
ACE_TMAIN (int argc, ACE_TCHAR *argv[])
{
return run_main (argc, argv);
}
多谢,亲爱的美美。
以上是关于ACE_TAO 007的主要内容,如果未能解决你的问题,请参考以下文章
ACE_TAO 017 ACE_wrappersexamplesReactor
ACE_TAO 017 ACE_wrappersexamplesReactor