贝贝花花包包店,精品555皮具,钱夹,皮夹

字体: | 推荐给好友 上一篇 | 下一篇

ACE程序员教程-第2章 进程间通信服务访问点包装

发布: 2008-6-13 14:31 | 作者: Umar Syyid | 来源: 转载 | 查看: 294次

2.2.2 使用ACE的数据报

  ACE_SOCK_DgramACE_LSOCK_DgramACE中的数据报包装类。这些包装包含了发送和接收数据报的方法,并包装了非面向连接的UDP协议和UNIXsocket协议。与流包装不同,这些包装封装的是非面向连接的协议。这也就意味着不存在用于“设置”连接的接受器和连接器。相反,在这种情况下,通信通过一系列的发送和接收来完成。每个send()都要指定目的远地地址作为参数。下面的例子演示怎样通过ACE使用数据报。这个例子使用了ACE_SOCK_Dgram包装(也就是UDP包装)。还可以使用包装UNIX域数据报的ACE_LSOCK_Dgram。两种包装的用法非常类似,唯一的不同是ACE_LSOCK_Dgram要用 ACE_UNIX_Addr类作为地址,而不是ACE_INET_Addr

 

2-3

//Server

#include "ace/OS.h"

#include "ace/SOCK_Dgram.h"

#include "ace/INET_Addr.h"

 

#define DATA_BUFFER_SIZE 1024

#define SIZE_DATA 19

 

class Server

{

public:

Server(int local_port)

:local_addr_(local_port),local_(local_addr_)

{

data_buf = new char[DATA_BUFFER_SIZE];

}

 

 

//Expect data to arrive from the remote machine. Accept it and display

//it. After receiving data, immediately send some data back to the

//remote.

int accept_data()

{

int byte_count=0;

while( (byte_count=local_.recv(data_buf,SIZE_DATA,remote_addr_))!=-1)

{

data_buf[byte_count]=0;

ACE_DEBUG((LM_DEBUG, "Data received from remote %s was %s \n"

,remote_addr_.get_host_name(), data_buf));

ACE_OS::sleep(1);

if(send_data()==-1) break;

}

return -1;

}

 

//Method used to send data to the remote using the datagram component

//local_

int send_data()

{

ACE_DEBUG((LM_DEBUG,"Preparing to send reply to client %s:%d\n",

remote_addr_.get_host_name(),remote_addr_.get_port_number()));

ACE_OS::sprintf(data_buf,"Server says hello to you too");

if( local_.send(data_buf, ACE_OS::strlen(data_buf)+1,remote_addr_)==-1)

return -1;

else

return 0;

}

 

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<2)

{

ACE_DEBUG((LM_DEBUG,"Usage %s ", argv[0]));

ACE_OS::exit(1);

}

Server server(ACE_OS::atoi(argv[1]));

server.accept_data();

}

 

上面的代码是一个简单的服务器,它等待客户应用通过周知端口给它发送一个数据报。在该数据报中含有定长的和预定数量的数据。服务器在收到这些数据时,就发送回复给原先发送数据的客户。

  Server类拥有名为local_ACE_SOCK_Dgram私有成员,它被同时用于接收和发送数据。Server在它的构造器中通过已知的ACE_INET_Addr(本地主机以及已知端口)实例化local_,这样客户就可以对它进行定位、并发送消息给它了。

  Server类包含两个方法:accept_data(),用于从客户接收数据(使用recv()调用包装);以及send_data(),用于发送数据给远地客户(使用send()调用包装)。注意local_包装类的send()receive()的底层调用都包装了BSD sendto()recvfrom()调用,并具有相类似的特征。

  主函数实例化Server类型的对象、并调用它的accept_data()方法,等待来自客户的数据。当它得到所需的数据后,它调用send_data()发送回复消息给客户。如此循环往复,直到客户被关闭为止。

  相应的客户代码与前面的服务器例子非常类似:

43/4<1234>
 

评分:0

我来说两句

seccode