找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3212|回复: 9

求助....

[复制链接]
发表于 2009-8-21 11:35:51 | 显示全部楼层 |阅读模式
我编了ACE程序员指南的第六章的例子,运行结果
客户端 connect:connection refused
服务器 waiting forconnection:connection timed out.....

为什么不能传数据?
发表于 2009-8-21 12:45:40 | 显示全部楼层
connection refused...
连接被拒绝了,还怎么传数据呀!
ACE很多测试程序都是需要手动输入参数的,
仔细看一下代码是不是参数没有设置正确。
 楼主| 发表于 2009-8-21 13:52:32 | 显示全部楼层

server

server.cpp

#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 ("HAstatus");
ACE_SOCK_Acceptor acceptor;
if (acceptor.open(port_to_listen, 1)==-1)
  ACE_ERROR_RETURN((LM_ERROR,
                    ACE_TEXT ("%p\n"),
        ACE_TEXT ("acceptor.open")),
        100);
int open(const ACE_Addr &local_sap,
       int reuse_addr = 0,
    int protocol_family = PF_INET,
    int backlog = ACE_DEFAULT_BACKLOG,
    int protocol = 0);

while(1)
{
  ACE_SOCK_Stream peer;
  ACE_INET_Addr peer_addr;
  ACE_Time_Value timeout (10,0);
#if 0
  if (acceptor.accept (peer) == -1)
   ACE_ERROR_RETURN((LM_ERROR,
                        ACE_TEXT (" (%p|%t) Failed to accept "),
                     ACE_TEXT ("client connection\n")),
         100);
#endif
  if(acceptor.accept (peer, &peer_addr, &timeout, 0)== -1)
  {
   if(ACE_OS::last_error() == EINTR)
    ACE_DEBUG ((LM_DEBUG,
                ACE_TEXT ("(%p|%t) Interrupted while "),
       ACE_TEXT ("waiting for connection\n")));
   else
    if(ACE_OS::last_error() == ETIMEDOUT)
     ACE_DEBUG ((LM_DEBUG,
                 ACE_TEXT ("(%p|%t) Timeoout while "),
            ACE_TEXT ("waiting for connection\n")));
  

  }
  else
  {
   const int MAXHOSTNAMELEN=32;
   ACE_TCHAR peer_name[MAXHOSTNAMELEN] ;
            peer_addr.addr_to_string(peer_name, MAXHOSTNAMELEN);                                                                                  peer_addr.addr_to_string (peer_name,MAXHOSTNAMELEN);
   ACE_DEBUG ((LM_DEBUG,
            ACE_TEXT (" (%p|%t) Connection from %s \n"),
      peer_name));
   char buffer[4096];
   ssize_t bytes_received;
   while((bytes_received = peer.recv (buffer, sizeof(buffer))) !=1)
   {
    peer.send_n (buffer, bytes_received);
   }
   peer.close();
  }
}
return(0);
}
 楼主| 发表于 2009-8-21 13:53:26 | 显示全部楼层

client

#include "ace/INET_Addr.h"
#include "ace/SOCK_Stream.h"
#include "ace/SOCK_connector.h"
#include "ace/LOG_Msg.h"
#include "stdio.h"
//#pragma comment(lib,"ws2_32")
int ACE_TMAIN(int, ACE_TCHAR *[])
{
ACE_INET_Addr srvr(50000, ACE_LOCALHOST);
ACE_SOCK_Connector connector;
ACE_SOCK_Stream peer;
if(-1==connector.connect(peer, srvr))
  ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT ("%p\n"), ACE_TEXT ("connect")),1);
int bc;
char buff[64];

peer.send_n ("uptime\n",7);
bc=peer.recv (buff,sizeof(buff));
write (1, buff, bc);
peer.close();
return(0);
}
 楼主| 发表于 2009-8-21 13:54:39 | 显示全部楼层

回复 #2 modern 的帖子

这就是那个SERVER和CLIENT的代码,什么地方出错了?
 楼主| 发表于 2009-8-21 14:04:48 | 显示全部楼层

回复 #2 modern 的帖子

我用的ACE 5.5
发表于 2009-8-21 14:38:45 | 显示全部楼层
1.看Server.cpp这段代码ACE_INET_Addr port_to_listen ("HAstatus");
测试了一下,由于指定的字符串并不能被识别,所以每次Server都会随机的监听一个端口。
你的客户端连接本机的端口50000,当然连接不上了。
你应该指定一个具体的端口号,如这么写ACE_INET_Addr port_to_listen (50000);
这是客户端 connect:connection refused的原因。
2.服务提示的错误明显是监听超时了,仔细看代码。
3.我查了一下书的第六章,以及ACE的代码,确实都是这么写的。
没想通为什么要这么写,确实很迷惑人。
 楼主| 发表于 2009-8-21 14:54:05 | 显示全部楼层

回复 #7 modern 的帖子

客户端显示了uptime正确了
但服务器显示<127.0.0.1:3631:no error|3576>connection from|?
connection from的信息没有显示出来.....
 楼主| 发表于 2009-8-21 15:39:09 | 显示全部楼层

回复 #8 psycheqiqi 的帖子

问题解决了,前面的就是
只不过它用了%P%T
 楼主| 发表于 2009-8-24 16:55:50 | 显示全部楼层

回复 #7 modern 的帖子

server端的ACE_INET_Addr port_to_listen ("HAstatus")这么写的原因?
因为在前面的一节 給客户增加健壮性里它增加了
ACE_INET_Addr addr;
addr.set ("HAStatus", ACE_LOCALHOST);
addr.set ("HAog",ACE_LOCALHOST);
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-11-23 00:02 , Processed in 0.015923 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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