ACE 내 TCP 통신

ACE 내 TCP 통신
개요:
전송 제어 프로토콜 TCP(Transmission Control Protocol): TCP는 신뢰할 수 있고 연결을 위한 운송 서비스를 제공하여 높은 신뢰성 데이터의 전송에 사용됩니다.TCP 프로토콜의 신뢰성은 모든 tcp 메시지가 발송 순서에 따라 클라이언트에 도착할 수 있도록 보장하는 것을 말한다.
Tcp 통신 프로세스는 일반적으로 다음과 같습니다.
서버 바인딩 포트, 클라이언트 연결 대기.

클라이언트는 서버의 IP와 서버가 연결된 포트를 통해 서버를 연결합니다.

서버와 클라이언트는 네트워크를 통해 데이터 통로를 구축하고 이 데이터 통로를 통해 데이터 상호작용을 한다.

일반 API:
1. ACE_INET_Addr 클래스.
ACE "주소"클래스 ACE_Addr의 하위 클래스는 TCP/IP 및 UDP/IP 주소를 나타냅니다.그것은 통상적으로 기계의 IP와 포트 정보를 포함하는데, 이를 통해 통신하는 프로세스를 찾을 수 있다.
정의: ACE_INET_Addr addInfo(3000,"192.168.1.100");일반적인 방법:
get_host_name 호스트 이름 가져오기

get_ip_address IP 주소 가져오기

get_port_number 포트 번호 가져오기

2. ACE_SOCK_Acceptor 클래스.
서비스 기간단에서 사용합니다. 포트를 연결하고 수동적으로 연결을 받는 데 사용됩니다.일반적인 방법:
오픈 바인딩 포트

accept 구축 및 클라이언트 연결

3.  ACE_SOCK_Connector 클래스.
클라이언트는 주동적으로 서버 연결을 구축하는 데 사용됩니다.일반적인 방법:
connect () 설정과 서비스 기간의 연결.

 4. ACE_SOCK_Stream 클래스.
클라이언트와 서버가 모두 사용되며 클라이언트와 서버 간의 데이터 통로를 나타낸다.일반적인 방법:
send () 데이터 전송

recv() 데이터 수신

close () 연결을 닫습니다.

코드 예:
다음 예에서는 ACE로 TCP 통신의 서버 포트를 만드는 방법을 보여 줍니다.
Cpp 코드
  • #include "ace/SOCK_Acceptor.h"  
  • #include "ace/SOCK_Stream.h"  
  • #include "ace/INET_Addr.h"  
  • #include "ace/OS.h"  
  •   
  • #include    
  • #include    
  • using namespace std;   
  •   
  • int main(int argc, char *argv[])    
  • {   
  •     ACE_INET_Addr port_to_listen(3000);//바인딩된 포트입니다
  •     ACE_SOCK_Acceptor acceptor;   
  • if(acceptor.open(port_to_listen, 1)=-1)//바인딩 포트
  •     {   
  •         cout<
  •         return -1;   
  •     }   
  •   
  •     while(true)   
  •     {   
  •         ACE_SOCK_Stream peer;//및 클라이언트의 데이터 경로입니다
  •         ACE_Time_Value timeout (10, 0);   
  •   
  •         if (acceptor.accept (peer) !=-1)//클라이언트와의 연결을 설정합니다
  •         {   
  •             cout<
  •             char buffer[1024];   
  •             ssize_t bytes_received;   
  •   
  •             ACE_INET_Addr raddr;   
  •             peer.get_local_addr(raddr);   
  •             cout<
  •   
  •             while ((bytes_received =   
  •                 peer.recv (buffer, sizeof(buffer))) !=-1)//클라이언트가 보낸 데이터를 읽습니다
  •             {   
  •                 peer.send(buffer, bytes_received);//클라이언트에 데이터를 보냅니다
  •             }   
  •             peer.close ();   
  •         }   
  •     }   
  •   
  •     return 0;    
  • }  
  • #include "ace/SOCK_Acceptor.h"
    #include "ace/SOCK_Stream.h"
    #include "ace/INET_Addr.h"
    #include "ace/OS.h"
    
    #include <string>
    #include <iostream>
    using namespace std;
    
    int main(int argc, char *argv[]) 
    {
        ACE_INET_Addr port_to_listen(3000);        // 
        ACE_SOCK_Acceptor acceptor;
        if (acceptor.open (port_to_listen, 1) == -1)     // 
        {
            cout<<endl<<"bind port fail"<<endl;
            return -1;
        }
    
        while(true)
        {
            ACE_SOCK_Stream peer;        // 
            ACE_Time_Value timeout (10, 0);
    
            if (acceptor.accept (peer) != -1)    // 
            {
                cout<<endl<<endl<<"client connect. "<<endl;
                char buffer[1024];
                ssize_t bytes_received;
    
                ACE_INET_Addr raddr;
                peer.get_local_addr(raddr);
                cout<<endl<<"local port/t"<<raddr.get_host_name()<<"/t"<<raddr.get_port_number()<<endl;
    
                while ((bytes_received =
                    peer.recv (buffer, sizeof(buffer))) != -1)    // 
                {
                    peer.send(buffer, bytes_received);    // 
                }
                peer.close ();
            }
        }
    
        return 0; 
    }
     
     
    이 예에서 실현된 기능은 매우 간단하다. 서버 측은 3000번 포트를 연결하고 클라이언트의 연결을 기다린 다음에 클라이언트에서 읽은 데이터를 다시 클라이언트에게 전달한다. 즉, EchoServer의 기능을 실현했다.
    적합한 클라이언트 프로그램도 비교적 간단하다. 코드는 다음과 같다.
    Cpp 코드
  • #include    
  • #include     
  • #include    
  • #include     
  •   
  • #include    
  • #include    
  • using namespace std;   
  •   
  • int main(int argc, char *argv[])    
  • {   
  •     ACE_INET_Addr addr(3000,"127.0.0.1");   
  •   
  •     ACE_SOCK_Connector connector;       
  •     ACE_Time_Value timeout(5,0);   
  •     ACE_SOCK_Stream peer;   
  •   
  •     if(connector.connect(peer,addr,&timeout) != 0)   
  •     {   
  •         cout<<"connection failed !"<
  •         return 1;   
  •     }   
  •     cout<<"conneced !"<
  •   
  •     string s="hello world";   
  •     peer.send(s.c_str(),s.length());//데이터를 보냅니다
  •     cout<
  •   
  •     ssize_t bc=0;//수신한 바이트 수입니다
  •   
  •     char buf[1024];   
  •     bc=peer.recv(buf,1024,&timeout);//데이터를 수신합니다
  •     if(bc>=0)   
  •     {   
  •         buf[bc]='/0';   
  •         cout<
  •     }   
  •     peer.close();   
  •   
  •     return 0;    
  • }  
  • #include <ace/SOCK_Stream.h>
    #include <ace/SOCK_Connector.h> 
    #include <ace/INET_Addr.h>
    #include <ace/Time_Value.h> 
    
    #include <string>
    #include <iostream>
    using namespace std;
    
    int main(int argc, char *argv[]) 
    {
        ACE_INET_Addr addr(3000,"127.0.0.1");
    
        ACE_SOCK_Connector connector;    
        ACE_Time_Value timeout(5,0);
        ACE_SOCK_Stream peer;
    
        if(connector.connect(peer,addr,&timeout) != 0)
        {
            cout<<"connection failed !"<<endl;
            return 1;
        }
        cout<<"conneced !"<<endl;
    
        string s="hello world";
        peer.send(s.c_str(),s.length());    // 
        cout<<endl<<"send:/t"<<s<<endl;
    
        ssize_t bc=0;            // 
    
        char buf[1024];
        bc=peer.recv(buf,1024,&timeout);    // 
        if(bc>=0)
        {
            buf[bc]='/0';
            cout<<endl<<"rev:/t"<<buf<<endl;
        }
        peer.close();
    
        return 0; 
    }
     
     
    다음 표에서는 서버 측과 클라이언트의 전송 프로세스를 비교합니다.
    조작하다
    클라이언트
    서버 측
    초기화
    필요 없음
    acceptor를 호출합니다.open() 바인딩 포트
    연결 설정
    커넥터를 호출합니다.connect () 메서드
    acceptor를 호출합니다.accept () 메서드
    데이터 전송
    발송:peer 호출.recv () 방법 수신:peer 호출.send() 메서드
    연결 해제
    피어를 호출합니다.close () 방법

    좋은 웹페이지 즐겨찾기