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

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

另外,我在发数据时,防火墙会给出提示,说我的程序要访问网络,我想打开端口应该是成功了的。
...全文
354 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jixingzhong 2006-11-03
  • 打赏
  • 举报
回复
把你的 防火墙 关掉 ...
Maconel 2006-11-03
  • 打赏
  • 举报
回复
晕,csdn结贴又出了毛病,以上两位我各给了50分,通报一下。:)
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
  • 打赏
  • 举报
回复
谢谢你的回复。
我就是在本机试的,我试了127.0.0.1和自己的实际ip,都是这样的错误。
我把代码贴出来吧,如果有时间的话,请帮我看一下。

#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[])
{
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();

return 0;
}
whoho 2006-11-03
  • 打赏
  • 举报
回复
先试试本机两个程序之间通信是否正常
Maconel 2006-11-03
  • 打赏
  • 举报
回复
自己顶一下。
Maconel 2006-11-03
  • 打赏
  • 举报
回复
我试过了,也不行。
而且当防火墙提示要程序要访问网络时,我是选了允许的。

24,855

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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