ACE_Select_Reactor 2 – 서버 게이트웨이

ACE의 흐름 패키지는 연결을 위한 통신을 제공합니다.스트림 데이터 전송 패키지 클래스는 ACE_ 포함SOCK_Stream 및 ACE_LSOCK_Stream은 TCP/IP와 UNIX 도메인 Socket 프로토콜 데이터 전송 기능을 각각 패키지화합니다.접속 구성 클래스에는 TCP/IP용 ACE_ 포함SOCK_Connector 및 ACE_SOCK_Acceptor 및 UNIX 도메인 소켓용 ACE_LSOCK_Connector 및 ACE_LSOCK_Acceptor.
 
 
class Server
{
public:
	Server (int port): server_addr_(port),peer_acceptor_(server_addr_)
	{
		data_buf_= new char[SIZE_BUF];
	}
	int handle_connection()
	{
		// Read data from client
			int byte_count=0;
			if( (byte_count=new_stream_.recv (data_buf_, SIZE_DATA, 0))==-1)
				ACE_ERROR ((LM_ERROR, "%p
", "Error in recv")); else { data_buf_[byte_count]=0; ACE_DEBUG((LM_DEBUG,"Server received %s
",data_buf_)); } // Close new endpoint if (new_stream_.close () == -1) ACE_ERROR ((LM_ERROR, "%p
", "close")); return 0; } int accept_connections () { if (peer_acceptor_.get_local_addr (server_addr_) == -1) ACE_ERROR_RETURN ((LM_ERROR,"%p
","Error in get_local_addr"),1); ACE_DEBUG ((LM_DEBUG,"Starting server at port %d
", 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
", "accept")); continue; } else { ACE_DEBUG((LM_DEBUG, "Connection established with remote %s:%d
", client_addr_.get_host_name(),client_addr_.get_port_number())); //Handle the connection handle_connection(); } } } 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 클래스에 포함된 accept_connection () 메서드에서 수신기를 사용하여 연결을 "들여쓰기"ACE_SOCK_Stream new_stream_.이 작업이 완료되는 기본 절차는 수신기의 accept () 를 호출하고 흐름을 매개 변수로 전송하는 것입니다.일단 연결이 되어 흐르는 포장 방법인 send()와recv()는 새로 만들어진 체인에서 데이터를 전송하고 수신할 수 있으며, 빈 ACE_INET_Addr도 수신기의 accept () 방법으로 전송되고 연결을 시작하는 원격 기기 주소로 설정됩니다.
연결이 설정된 후 서버 호출handle_connection () 방법은 클라이언트로부터 미리 알고 있는 단어를 받아서 흐름을 닫기 시작합니다.연결 닫기는 흐르는 close () 방법을 호출하여 완성합니다. 이 방법은 모든 Socket 자원을 방출하고 연결을 종료합니다.
 
    http://acme-ltt.iteye.com/blog/1455556 에서 언급한 ACE_Select_Reactor, static ACE_THR_FUNC_RETURN controller(void*arg) 함수에서 상기 서버 클래스를 호출하여 ACE_ 기반 구축Select_Reactor의 Socket 서버 게이트웨이입니다.
 
 
클라이언트 프로그램:
 
#include "ace/SOCK_Connector.h"
#include "ace/INET_Addr.h"
#include "ace/OS.h"
#include "ace/Log_Msg.h"
#include <stdlib.h>
#include "text.h"
#include "ace/Thread_Manager.h"
#include <iostream>
#define SIZE_BUF 128
static const ACE_Time_Value TIME_INTERVAL(0, 1000000);
class Client
{
public:
	Client(char *hostname, int port):remote_addr_(port,hostname)
	{   
	    
		
	}
	int connect_to_server()
	{
		
		ACE_DEBUG ((LM_DEBUG, "(%P|%t) Starting connect to %s:%d
", remote_addr_.get_host_name(),remote_addr_.get_port_number())); if (connector_.connect (client_stream_, remote_addr_) == -1) ACE_ERROR_RETURN ((LM_ERROR,"(%P|%t) %p
","connection failed"),-1); else ACE_DEBUG ((LM_DEBUG,"(%P|%t) connected to %s
", remote_addr_.get_host_name ())); return 0; } int send_to_server() { iovec iov[3]; iov[0].iov_base = (void *)"get"; iov[0].iov_len = 3; iov[1].iov_base = getdata()/* some data */; iov[1].iov_len = strlen(getdata()); iov[2].iov_base = (void *)"end."; iov[2].iov_len = 4; if (client_stream_.sendv_n (iov,3) == -1) { ACE_ERROR_RETURN ((LM_ERROR,"(%P|%t) %p
","send_n"),0); //break; exit(0); } close(); } int close() { if (client_stream_.close () == -1) ACE_ERROR_RETURN ((LM_ERROR,"(%P|%t) %p
","close"),-1); else return 0; } private: ACE_SOCK_Stream client_stream_; ACE_INET_Addr remote_addr_; ACE_SOCK_Connector connector_; char *data_buf_; }; int main (int argc, char *argv[]) { if(argc<3) { ACE_DEBUG((LM_DEBUG,”Usage %s <hostname> <port_number>
”, argv[0])); ACE_OS::exit(1); } Client client(argv[1],ACE_OS::atoi(argv[2])); client.connect_to_server(); client.send_to_server(); }

클라이언트는 단일 클라이언트 클래스로 표시됩니다.클라이언트에 connect_ 포함to_server() 및send_to_서버 () 메서드입니다.
    connect_to_server() 메서드는 ACE_ 유형을 사용합니다.SOCK_Connector 커넥터는 사전 예방적으로 연결됩니다.연결 설정은 커넥터의connect() 방법을 호출하여 이루어집니다. 전송된 매개 변수는 연결하려는 기계의 원격 주소와 연결을 위한 빈 ACE_SOCK_Stream .원격 기계가 실행될 때 매개 변수에 지정됩니다.connect () 메서드가 성공적으로 반환되면 ACE_ 를 사용하여SOCK_Stream 봉인 클래스의send()와recv() 방법족은 새로 만들어진 체인에서 데이터를 보내고 수신하는 데 사용할 수 있습니다.
 
이 코드에서 연결이 완료되면send_to_서버 () 방법이 호출됩니다. iovec 형식의 그룹을 sendv_로n () 메서드, 서버에 전송합니다.

좋은 웹페이지 즐겨찾기