peakzhang 发表于 2007-12-18 23:59:55

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

客户端代码:

#include "ace/INET_Addr.h"
#include "ace/SOCK_Stream.h"
#include "ace/Log_Msg.h"
#include "ace/SOCK_Connector.h"
#include "ace/OS.h"
int ACE_TMAIN(int, ACE_TCHAR* [])
{
   ACE_INET_Addr srvr(50000, ACE_LOCALHOST);
   ACE_SOCK_CONNECTOR connector;
   ACE_SOCK_Stream peer;
   if (connector.connect(peer, srvr) == -1)         // 发送数据前建立连接,发送成功后发送第二条数据失败!
      return -1;
   int bc = 0, i = 0;
   char buf = {0};
   ssize_t bytes_sended = 0;
   while (1)
   {
       // if (connector.connect(peer, srvr) == -1)         // 每次发送数据前建立连接 OK
       //   return -1;

       char data = {0};
       ACE_OS::sprintf(data, "uptime-%d", i);
       bytes_sended = peer.send_n(data, ACE_OS::strlen(data));
       if (bytes_sended < 0)
       {
         int error = ACE_OS::last_error();
         continue;
       }
       bc = peer.recv(buf, sizeof(buf));
       ACE_DEBUG((LM_INFO, "receive from server data is [%s]\n", buf));
       ACE_OS::sleep(10);
       i++;
       //peer.close();
       bytes_sended = 0;
       bc = 0;
   }
    peer.close();
   return 0;
}
服务端代码:
#include "ace/INET_Addr.h"
#include "ace/SOCK_Stream.h"
#include "ace/SOCK_Acceptor.h"
#include "ace/Log_Msg.h"
#include "ace/Time_Value.h"
int ACE_TMAIN(int, ACE_TCHAR* [])
{
    ACE_INET_Addr port_to_listen(50000);
    ACE_SOCK_Acceptor acceptor;
    if (acceptor.open(port_to_listen, 1) == -1)
      return -1;
    while (1)
    {
      ACE_SOCK_Stream peer;
      ACE_INET_Addr peer_addr;
      ACE_Time_Value timeout(10, 0);
      if (acceptor.accept(peer, &peer_addr) == -1)
      {
            break;
      }
      else
      {
            ACE_TCHAR peer_name = {0};
            peer_addr.addr_to_string(peer_name, 256);
            ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Connection from %s\n"), peer_name));
            ssize_t bytes_received = 0;
            char buffer = {0};
            bytes_received = peer.recv(buffer, sizeof(buffer));
            if (bytes_received > 0)
            {
                ACE_DEBUG((LM_INFO, "receive data is : [%s]\n", buffer));
                peer.send_n(buffer, bytes_received);
            }
            peer.close();
         }
   }
   return 0;
}

我先问问大侠们,客户端对于ACE的 ACE_SOCK_CONNECTOR 每次在send_n时候都需要先建立连接后,才能往客户段发送数据,难道没有建立常连接后,发送数据,也就是说建立一次连接,然后不停发送数据?不知是不是我的使用方式有误,请坛友们指点!谢谢(注意红色部分,当每次发送数据都建立连接,则程序正常)

peakzhang 发表于 2007-12-19 00:00:04

你写错了。peer.close();
tcp链接是你自己关闭的,ACE在忠实的执行你要求的操作。

peakzhang 发表于 2007-12-19 00:00:13

好意思,那个写错了peer.close();应该在while循环外。

同样的存在问题,不知何故?哪位大侠能讲解下原理,谢谢了!

peakzhang 发表于 2007-12-19 00:00:19

accept阻塞了,移到while循环外面就ok!
页: [1]
查看完整版本: 关于ACE Socket编程问题(附源码)