ACE_Select_Reactor 2 – 서버 게이트웨이
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 () 메서드, 서버에 전송합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
React 구성 요소에서 소켓 이벤트 리스너가 여러 번 실행됩니다.기본적이지만 종종 간과되는 사이드 프로젝트를 하면서 배운 것이 있습니다. 이 프로젝트에는 단순히 두 가지 주요 부분이 포함되어 있습니다. 프런트 엔드: 반응 및 재료 UI 백엔드: Express, Typescript...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.