ACE的初级问题--《ACE程序员教程》中的udp例子不管用

Maconel 2006-11-03 03:52:16
我是个ace的初学者,现在已经顺利的装上了ace,并且可以编译成功。
但是我自己写了个小例子,就是用udp收发数据,在发送数据时,调用ACE_SOCK_Dgram::send()方法总是返回-1。
我没有找到ace的帮助文档,不知道返回值表示什么。不过从以往的经验,我想-1肯定是失败了,而且服务端也确实没有收到数据。
我又试了《ACE程序员教程》中给出的udp的例子,也是同样的结果。
请问我该怎么办呢,请有经验的朋友给个提示,谢谢。

另外,我在发数据时,防火墙会给出提示,说我的程序要访问网络,我想打开端口应该是成功了的。
...全文
266 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Maconel 2006-11-03
  • 打赏
  • 举报
回复
谢谢大家的回复。
我已经找到了错误的地方。
在初始化远程端口号时,是这样写的:
remote_addr_(remote_host),也就是调用的这个函数原型:
ACE_INET_Addr::ACE_INET_Addr(const char address[]);
而ace帮助文档中说,这个address必须是这样的形式:"127.0.0.1:5000",如果这个字符串中没有':'的话,就会把address当成是端口号,而把ip设为INADDR_ANY,也就是0.0.0.0,所以就出了错。
看来这个叫《ACE程序员教程》的书的代码是相当有问题呀。

不管怎样,还是感谢大家的回复。
Maconel 2006-11-03
  • 打赏
  • 举报
回复
to hxzb7215191(天行健,君子以自强不息):
你好,我试了加上初始化的代码,加init()和改main函数的方法都试了,也还是不行。
下面是代码,挺简单的,如果有时间请帮我看一下,谢谢。

#include "ace/ACE.h"
#include "ace/OS.h"
#include "ace/SOCK_Dgram.h"
#include "ace/INET_Addr.h"
#include "ace/Log_Msg.h"

#define DATA_BUFFER_SIZE 1024
#define SIZE_DATA 28

class Client
{
public:
Client(char* remote_host, int port)
: remote_addr_(remote_host), local_addr_((u_short)0), local_(local_addr_)
{
data_buf = new char[DATA_BUFFER_SIZE];
remote_addr_.set_port_number(port);
}

int accept_data()
{
if (local_.recv(data_buf, SIZE_DATA, remote_addr_) != -1)
{
ACE_DEBUG((LM_DEBUG, "Data received from remote server %s was: %s \n",
remote_addr_.get_host_name(), data_buf));
return 0;
}
else
return -1;
}

int send_data()
{
ACE_DEBUG((LM_DEBUG, "Preparing to send data to server %s:%d\n",
remote_addr_.get_host_name(),remote_addr_.get_port_number()));
ACE_OS::sprintf(data_buf, "Client says hello");
while (local_.send(data_buf, ACE_OS::strlen(data_buf), remote_addr_) != -1)
{
ACE_OS::sleep(1);
if (accept_data() == -1)
break;
}
return -1;
}
private:
char* data_buf;
ACE_INET_Addr remote_addr_;
ACE_INET_Addr local_addr_;
ACE_SOCK_Dgram local_;
};

int main(int argc, char *argv[])
{
ACE::init();

if (argc<3)
{
ACE_OS::printf("Usage: %s <hostname> <port_number> \n", argv[0]);
ACE_OS::exit(1);
}
Client client(argv[1], ACE_OS::atoi(argv[2]));
client.send_data();

ACE::fini();

return 0;
}
Maconel 2006-11-03
  • 打赏
  • 举报
回复
谢谢几位的回复。

1、暂时还没时间买书,开始学ace才2、3天,有空我会去看看,但是中关村太远了,花几百块钱去北京买本书太不划算,呵呵。

2、防火墙关掉试过了,一样不行。

3、我会试一下初始化的的问题,谢谢。
hxzb7215191 2006-11-03
  • 打赏
  • 举报
回复
如果没有的话.要在main里加这两个函数.
ACE::init();
ACE::fini();

或是main函数改成ACE_TMAIN()
hxzb7215191 2006-11-03
  • 打赏
  • 举报
回复
初始化了ACE环境没有.
trueadou 2006-11-03
  • 打赏
  • 举报
回复
把防火墙先关了再试下!
cimil 2006-11-03
  • 打赏
  • 举报
回复
买书了没有,有几本经典的译书,中关村图书大厦有

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧