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);
}

 多谢,亲爱的美美。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值