现在的位置: 首页 > 综合 > 正文

ACE:ACE_SOCK_STREAM应用实例

2014年01月20日 ⁄ 综合 ⁄ 共 1459字 ⁄ 字号 评论关闭

ACE_SOCK_Acceptor用于被动连接的建立,基于BSD accept()和listen()调用,

接受客户端连接请求后,将可靠的数据流传递给ACE_SOCK_STREAM类的一个对象,便可调用流的recv(),send()方法在流上接收或发送数据。

另外,ACE_INET_Addr封装了传统的地址结构体。

#include <stdio.h>
#include <stdlib.h>
#include "ace/SOCK_Acceptor.h"
#include "ace/SOCK_Stream.h"
#include "ace/Log_Msg.h"

#define SIZE_DATA 50
#define SIZE_BUF 1024
#define NO_ITERATIONS 5

class Server{

public:
Server(int port):_local_addr(port),_acceptor(_local_addr)
{
data_buf = new char[SIZE_BUF];
}

int handle_connection()
{
memset(data_buf,0,sizeof(data_buf));
for(int i=0;i<NO_ITERATIONS;i++)
{
int byte_count=0;
if((byte_count=_stream.recv_n(data_buf,SIZE_DATA,0))==-1)
ACE_ERROR((LM_ERROR,"%p\n","Error in Recv"));

else
{
data_buf[byte_count]='\0';
ACE_DEBUG((LM_DEBUG,"Server received:%s\n",data_buf));
}

}
_stream.close();
return 0;
}

int accept_connections()
{
if(_acceptor.get_local_addr(_local_addr)==-1)
{
ACE_ERROR_RETURN((LM_ERROR,"%p\n","Error in get_local_addr"),-1);
}

ACE_DEBUG((LM_DEBUG,"Starting Server at%d\n",_local_addr.get_port_number()));
while(1)
{
ACE_Time_Value timeout(ACE_DEFAULT_TIMEOUT);
if(_acceptor.accept(_stream,&_remote_addr,&timeout)==-1)
{
ACE_ERROR((LM_ERROR,"%p","accept"));
continue;
}
else
{
ACE_DEBUG((LM_DEBUG,"Connetions established with remote:%s,%d",
_remote_addr.get_host_name(),_remote_addr.get_port_number()));

handle_connection();
}
}
}

private:
char *data_buf;
ACE_INET_Addr _remote_addr;
ACE_INET_Addr _local_addr;
ACE_SOCK_Acceptor _acceptor;
ACE_SOCK_Stream _stream;

};

int main(void)
{
Server server(10000);
server.accept_connections();
return 0;
}

抱歉!评论已关闭.