找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 5186|回复: 3

关于ACE Socket编程问题(附源码)

[复制链接]
发表于 2007-12-18 23:59:55 | 显示全部楼层 |阅读模式
客户端代码:
  1. #include "ace/INET_Addr.h"
  2. #include "ace/SOCK_Stream.h"
  3. #include "ace/Log_Msg.h"
  4. #include "ace/SOCK_Connector.h"
  5. #include "ace/OS.h"
  6. int ACE_TMAIN(int, ACE_TCHAR* [])
  7. {
  8.    ACE_INET_Addr srvr(50000, ACE_LOCALHOST);
  9.    ACE_SOCK_CONNECTOR connector;
  10.    ACE_SOCK_Stream peer;
  11.    if (connector.connect(peer, srvr) == -1)         // 发送数据前建立连接,发送成功后发送第二条数据失败!
  12.       return -1;
  13.    int bc = 0, i = 0;
  14.    char buf[64] = {0};
  15.    ssize_t bytes_sended = 0;
  16.    while (1)
  17.    {
  18.        // if (connector.connect(peer, srvr) == -1)         // 每次发送数据前建立连接 OK
  19.        //     return -1;
  20.        char data[16] = {0};
  21.        ACE_OS::sprintf(data, "uptime-%d", i);
  22.        bytes_sended = peer.send_n(data, ACE_OS::strlen(data));
  23.        if (bytes_sended < 0)
  24.        {
  25.            int error = ACE_OS::last_error();
  26.            continue;
  27.        }
  28.        bc = peer.recv(buf, sizeof(buf));
  29.        ACE_DEBUG((LM_INFO, "receive from server data is [%s]\n", buf));
  30.        ACE_OS::sleep(10);
  31.        i++;
  32.        //peer.close();
  33.        bytes_sended = 0;
  34.        bc = 0;
  35.    }
  36.     peer.close();
  37.    return 0;
  38. }
  39. 服务端代码:
  40. #include "ace/INET_Addr.h"
  41. #include "ace/SOCK_Stream.h"
  42. #include "ace/SOCK_Acceptor.h"
  43. #include "ace/Log_Msg.h"
  44. #include "ace/Time_Value.h"
  45. int ACE_TMAIN(int, ACE_TCHAR* [])
  46. {
  47.     ACE_INET_Addr port_to_listen(50000);
  48.     ACE_SOCK_Acceptor acceptor;
  49.     if (acceptor.open(port_to_listen, 1) == -1)
  50.         return -1;
  51.     while (1)
  52.     {
  53.         ACE_SOCK_Stream peer;
  54.         ACE_INET_Addr peer_addr;
  55.         ACE_Time_Value timeout(10, 0);
  56.         if (acceptor.accept(peer, &peer_addr) == -1)
  57.         {
  58.             break;
  59.         }
  60.         else
  61.         {
  62.             ACE_TCHAR peer_name[256] = {0};
  63.             peer_addr.addr_to_string(peer_name, 256);
  64.             ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Connection from %s\n"), peer_name));
  65.             ssize_t bytes_received = 0;
  66.             char buffer[4096] = {0};
  67.             bytes_received = peer.recv(buffer, sizeof(buffer));
  68.             if (bytes_received > 0)
  69.             {
  70.                 ACE_DEBUG((LM_INFO, "receive data is : [%s]\n", buffer));
  71.                 peer.send_n(buffer, bytes_received);
  72.             }  
  73.             peer.close();
  74.          }
  75.      }
  76.      return 0;
  77. }
复制代码
我先问问大侠们,客户端对于ACE的 ACE_SOCK_CONNECTOR 每次在send_n时候都需要先建立连接后,才能往客户段发送数据,难道没有建立常连接后,发送数据,也就是说建立一次连接,然后不停发送数据?不知是不是我的使用方式有误,请坛友们指点!谢谢(注意红色部分,当每次发送数据都建立连接,则程序正常)
 楼主| 发表于 2007-12-19 00:00:04 | 显示全部楼层
你写错了。peer.close();
tcp链接是你自己关闭的,ACE在忠实的执行你要求的操作。
 楼主| 发表于 2007-12-19 00:00:13 | 显示全部楼层
好意思,那个写错了peer.close();应该在while循环外。

同样的存在问题,不知何故?哪位大侠能讲解下原理,谢谢了!
 楼主| 发表于 2007-12-19 00:00:19 | 显示全部楼层
accept阻塞了,移到while循环外面就ok!
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-5-18 10:13 , Processed in 0.012683 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表