ACE的select函数使用问题

youdang45 2009-03-06 03:50:21
代码写的比较乱,见谅
server:

#include "ace/OS.h"
#include "ace/INET_Addr.h"
#include "ace/SOCK_Dgram.h"
#include "ace/Log_Msg.h"
#include "ace/IPC_SAP.h"
#include "ace/Time_Value.h"
#include "ace/ACE.h"
#include "ace/Handle_Set.h"
#include <iostream>

using namespace std;

typedef struct request
{
int ID;
int grade;
}Request, *RequestP;

class Server
{
public:
Server(u_short port_num):_local_addr(port_num), _udp_sock(_local_addr)
{
_buf = new Request;
}
int enable(int value) const
{
return _udp_sock.enable(value);
}
ACE_HANDLE get_handle() const
{
return _udp_sock.get_handle();
}
void recv()
{
if(_udp_sock.recv(_buf, sizeof(Request), _remote_addr) < 0)
{
cout << "receive from client fail" << endl;
exit(1);
}
cout << "client: " << _buf->ID << "\n"
<< "grade: " << _buf->grade << endl;
//cout << "client info :" << (*(_remote_addr.get_host_name())) << ":" << _remote_addr.get_port_number << endl;
ACE_DEBUG((LM_DEBUG, "Data received from remote %s from port %d \n", _remote_addr.get_host_name(), _remote_addr.get_port_number()));
send();
}
ssize_t send()
{
ssize_t send_size;
char buf[10] = "recv ok";
if((send_size = _udp_sock.send(buf, 10, _remote_addr)) < 0)
{
cout << "server send fail" << endl;
exit(1);
}
}
~Server()
{
delete _buf;
}
private:
ACE_INET_Addr _local_addr;
ACE_INET_Addr _remote_addr;
ACE_SOCK_Dgram _udp_sock;
RequestP _buf;
};

int main(int argc, char * argv[])
{
if(argc < 3)
{
cout << "usage: server < port1 > < port2 >" << endl;
exit(1);
}

Server server1(ACE_OS::atoi(argv[1]));
Server server2(ACE_OS::atoi(argv[2]));
server1.enable(ACE_NONBLOCK);
server2.enable(ACE_NONBLOCK);
ACE_Handle_Set active_handles;
ACE_HANDLE handle1 = server1.get_handle();
active_handles.set_bit(handle1);
ACE_HANDLE handle2 = server2.get_handle();
active_handles.set_bit(handle2);
ACE_HANDLE max = active_handles.max_set();
ACE_Time_Value time(130);
int ret;
while((ret = ACE::select(max + 1, &active_handles, NULL, NULL, &time)) != 0)
{
if(ret > 0)
{
if(active_handles.is_set(handle1))
server1.recv();

if(active_handles.is_set(handle2))
server2.recv();
}

if(ret < 0)
{
cout << "select fail" << endl;
}
}

cout << "time out " << endl;
return 0;
}



client:
#include "ace/SOCK_Dgram.h"
#include "ace/INET_Addr.h"
#include "ace/Log_Msg.h"
#include <iostream>

using namespace std;

typedef struct request
{
int ID;
int grade;
}Request, *RequestP;

class Client
{
public:
Client(const ACE_INET_Addr &remote):_remote_addr(remote), _local_addr(), _udp_sock(_local_addr)
{
_buf = new Request;
}
void send()
{
cout << "please input ID" << endl;
cin >> _buf->ID;
cout << "please input grade" << endl;
cin >> _buf->grade;
if(_udp_sock.send(_buf, sizeof(Request), _remote_addr) < 0)
{
cout << "send data to server fail" << endl;
exit(1);
}
recv();
}
void recv()
{
char buf[10];
if(_udp_sock.recv(buf, 10, _remote_addr) < 0)
{
cout << "receive from server fail" << endl;
exit(1);
}
ACE_DEBUG((LM_DEBUG, "Data received from server %s is %s\n", _remote_addr.get_host_name(), buf));

}
~Client()
{
delete _buf;
}
private:
ACE_INET_Addr _local_addr;
ACE_INET_Addr _remote_addr;
ACE_SOCK_Dgram _udp_sock;
RequestP _buf;
};

int main(int argc, char *argv[])
{
if(argc < 3)
{
cout << "usage: <serv_addr> <port>" << endl;
exit(1);
}

ACE_INET_Addr server(ACE_OS::atoi(argv[2]),argv[1]);
Client client(server);
client.send();
}


请教达人:select只能轮询到一个端口号,另一个收不到包是怎么回事?
...全文
377 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
这么长,看着累,帮你顶吧.
youdang45 2009-03-06
  • 打赏
  • 举报
回复
我自己写答案吧
是自己对于select函数理解的不够清楚
select传进的ACE_HANDLE参数是值结果参数
所以要重置rset中的位
server改为:

#include "ace/OS.h"
#include "ace/INET_Addr.h"
#include "ace/SOCK_Dgram.h"
#include "ace/Log_Msg.h"
#include "ace/IPC_SAP.h"
#include "ace/Time_Value.h"
#include "ace/ACE.h"
#include "ace/Handle_Set.h"
#include <iostream>

using namespace std;

typedef struct request
{
int ID;
int grade;
}Request, *RequestP;

class Server
{
public:
Server(u_short port_num):_local_addr(port_num), _udp_sock(_local_addr)
{
_buf = new Request;
}
int enable(int value) const
{
return _udp_sock.enable(value);
}
ACE_HANDLE get_handle() const
{
return _udp_sock.get_handle();
}
void recv()
{
if(_udp_sock.recv(_buf, sizeof(Request), _remote_addr) < 0)
{
cout << "receive from client fail" << endl;
exit(1);
}
cout << "client: " << _buf->ID << "\n"
<< "grade: " << _buf->grade << endl;
//cout << "client info :" << (*(_remote_addr.get_host_name())) << ":" << _remote_addr.get_port_number << endl;
ACE_DEBUG((LM_DEBUG, "Data received from remote %s from port %d \n", _remote_addr.get_host_name(), _remote_addr.get_port_number()));
send();
}
ssize_t send()
{
ssize_t send_size;
char buf[10] = "recv ok";
if((send_size = _udp_sock.send(buf, 10, _remote_addr)) < 0)
{
cout << "server send fail" << endl;
exit(1);
}
}
~Server()
{
delete _buf;
}
private:
ACE_INET_Addr _local_addr;
ACE_INET_Addr _remote_addr;
ACE_SOCK_Dgram _udp_sock;
RequestP _buf;
};

int main(int argc, char * argv[])
{
if(argc < 3)
{
cout << "usage: server < port1 > < port2 >" << endl;
exit(1);
}

Server server1(ACE_OS::atoi(argv[1]));
Server server2(ACE_OS::atoi(argv[2]));
server1.enable(ACE_NONBLOCK);
server2.enable(ACE_NONBLOCK);
ACE_Handle_Set active_handles;
ACE_HANDLE handle1 = server1.get_handle();
//active_handles.set_bit(handle1);
ACE_HANDLE handle2 = server2.get_handle();
//active_handles.set_bit(handle2);
ACE_HANDLE max = active_handles.max_set();
ACE_Time_Value time(130);
int ret;
while((ret = ACE::select(max + 1, &active_handles, NULL, NULL, &time)) != 0)
{
active_handles.set_bit(handle1);//每次select后进行重置
active_handles.set_bit(handle2);//同上


if(ret > 0)
{
if(active_handles.is_set(handle1))
server1.recv();

if(active_handles.is_set(handle2))
server2.recv();
}

if(ret < 0)
{
cout << "select fail" << endl;
}
}

cout << "time out " << endl;
return 0;
}


youdang45 2009-03-06
  • 打赏
  • 举报
回复
有没有高手了解?

急啊!

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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