找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4035|回复: 1

死循环@APG中的第一个例子

[复制链接]
发表于 2007-12-13 00:03:27 | 显示全部楼层 |阅读模式
初学ACE,照猫画虎,把 APG书上的例子server / client稍微改了一下。结果在server的while(
(bytes_received = peer.recv(buffer, sizeof(buffer)) ) != -1)这一句遇到意想不到结果。
  1. //client
  2. #include "ace/INET_Addr.h"
  3. #include "ace/SOCK_Stream.h"
  4. #include "ace/SOCK_Connector.h"
  5. #include "ace/Log_Msg.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 (-1 == connector.connect(peer, srvr))
  12.     {
  13.         ACE_ERROR_RETURN(  (LM_ERROR, ACE_TEXT("%p\n"), ACE_TEXT("connect") ),  1);
  14.     }
  15.     int bc;
  16.     char buf[64];
  17.     peer.send_n("uptime\n", 7);
  18.     bc = peer.recv(buf, sizeof(buf));
  19.     write(1, buf, bc);//输出到屏幕
  20.     peer.close();
  21.     return (0);
  22. }
  23. //server
  24. #include <iostream>
  25. #include "ace/INET_Addr.h"
  26. #include "ace/Log_Msg.h"
  27. #include "ace/SOCK_Acceptor.h"
  28. #include "ace/SOCK_Stream.h"
  29. #include "ace/Time_Value.h"
  30. #include "ace/os_include/os_netdb.h"
  31. using namespace std;
  32. int ACE_TMAIN (int, ACE_TCHAR * [])
  33. {
  34.     ACE_INET_Addr port_to_listen (50000, ACE_LOCALHOST);
  35.     ACE_SOCK_Acceptor acceptor;
  36.     if (acceptor.open(port_to_listen, 1) == -1)
  37.     {
  38.         ACE_ERROR_RETURN( (LM_ERROR, ACE_TEXT("%p\n")ACE_TEXT("acceptor.open")), 100);
  39.     }
  40.     while (1)
  41.     {
  42.         ACE_SOCK_Stream peer;
  43.         ACE_INET_Addr peer_addr;
  44.         ACE_Time_Value timeout(10, 0);
  45. #if 0
  46.         if (acceptor.accept(peer) == -1)
  47.         {
  48.             ACE_ERROR_RETURN( (LM_ERROR, ACE_TEXT("(%P|%t) Failed to accept client connection\n")), 100);
  49.         }
  50. #endif
  51.         if (acceptor.accept(peer, &peer_addr, &timeout, 0) == -1)
  52.         {
  53.             if (ACE_OS::last_error() == EINTR)
  54.             {
  55.                 ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Interrupted while waiting for connection\n")));
  56.             }
  57.             else if (ACE_OS::last_error() == ETIMEDOUT)
  58.             {
  59.                 ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Timeout while waiting for connection\n")));
  60.             }
  61.         }
  62.         else
  63.         {
  64.             ACE_TCHAR peer_name[MAXHOSTNAMELEN];
  65.             peer_addr.addr_to_string(peer_name, MAXHOSTNAMELEN);
  66.             ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Connection from %s \n"), peer_name));
  67.             char buffer[4096];
  68.             ssize_t bytes_received;
  69.             while( (bytes_received = peer.recv(buffer, sizeof(buffer)) ) != -1) //此处有个死循环
  70.             {
  71.                 ACE_DEBUG((LM_DEBUG, ACE_TEXT("%s \n"), buffer));
  72.                 peer.send_n (buffer, bytes_received);//原样返回给客户端
  73.                 ACE_OS::sleep(20);
  74.             }
  75.             peer.close();
  76.             ACE_DEBUG((LM_DEBUG, ACE_TEXT("peer.close\n")));
  77.         }
  78.     }
  79.     return (0);
  80. }
复制代码
 楼主| 发表于 2007-12-13 00:05:00 | 显示全部楼层
不关buffer的事。我把上面的while语句中的 != -1改成 >0就不再死循环了。
另外请教大家一个问题,我在本机收发(Client发,Server收),同时运行。我发现server端显示的端口号一直在递增,这是什么原因呢?难道我没有及时地关闭不用的连接?
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-11-23 19:08 , Processed in 0.012064 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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