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

ACE_TAO 017 ACE_wrappersexamplesReactor

ACE_TAO 003

ACE_TAO 013 ACE_NEW_RETURN

ACE_TAO 013 ACE_NEW_RETURN