ACE6测试之ACE_SOCK_Stream

       ACE中的流包装提供面向连接的通信。流数据传输包装类包括ACE_SOCK_Stream和ACE_LSOCK_Stream,连接建立类包括针对TCP/IP的ACE_SOCK_Connector和ACE_SOCK_Acceptor,以及针对UNIX域socket的ACE_LSOCK_Connector和ACE_LSOCK_Acceptor。

       1.下面创建一个被动服务器,侦听到来的客户连接。服务器接收来自客户的数据,然后关闭连接。连接关闭通过调用流上的close方法来完成,该方法会释放所有的socket资源并终止连接。

Server.h

#pragma once

#include "ace/Time_Value.h"
#include "ace/SOCK_Acceptor.h"
#include "ace/SOCK_Stream.h"
#include "ace/Log_Msg.h"

#define SIZE_DATA 18
#define SIZE_BUF 1024
#define NO_ITERATIONS 5

class Server
{
public:
	Server(int port);
	~Server(void);
	int handle_connection();
	int accept_connections();
private:
	char *data_buf_;
	ACE_INET_Addr server_addr_;
	ACE_INET_Addr client_addr_;
	ACE_SOCK_Acceptor peer_acceptor_;
	ACE_SOCK_Stream new_stream_;
};

Server.cpp

#include "Server.h"

Server::Server( int port ):server_addr_(port),
	peer_acceptor_(server_addr_)
{
	data_buf_=new char[SIZE_BUF];
}


Server::~Server(void)
{
}

int Server::accept_connections()
{
	if(peer_acceptor_.get_local_addr(server_addr_)==-1)
		ACE_ERROR_RETURN ((LM_ERROR,"%p\n","Error in get_local_addr"),1);
	ACE_DEBUG ((LM_DEBUG,"Starting server at port %d\n",
		server_addr_.get_port_number()));
	while(1)
	{
		ACE_Time_Value timeout (ACE_DEFAULT_TIMEOUT);
		if(peer_acceptor_.accept(new_stream_,&client_addr_,&timeout)== -1)
		{
			ACE_ERROR((LM_ERROR,"%p\n","accept"));
			continue;
		}
		else
		{
			ACE_DEBUG((LM_DEBUG,
				"Connection established with remote %s: %d\n",
				client_addr_.get_host_name(),client_addr_.get_port_number()));
			///handle the connection
			handle_connection();
		}
	}
}

int Server::handle_connection()
{
	//read data from client
	for(int i=0; i< NO_ITERATIONS; i++)
	{
		int byte_count=0;
		if((byte_count=new_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_));
		}
	}
	//close new endpoint
	if(new_stream_.close()== -1)
		ACE_ERROR((LM_ERROR,"%p\n","close"));
	return 0;
}
main.cpp

#include <QtCore/QCoreApplication>
#include "Server.h"
#include "ace/OS_NS_stdlib.h"

int main(int argc, char *argv[])
{
	QCoreApplication a(argc, argv);
	if(argc< 2)
	{
		ACE_ERROR((LM_ERROR,"Usage %s <port_num>",argv[0]));
		ACE_OS::exit(1);
	}

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

	return a.exec();
}

以上代码摘自:ACE程序员教程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值