Server
 * recv_n에 10초간 타임아웃을 주고 대기함
        char    buff[1024];
        size_t  recvLen = 0;
        ACE_Time_Value  timeout(10);
        int ret = peer.recv_n( buff, sizeof(buff)-1, &timeout, &recvLen );
        ACE_DEBUG( (LM_DEBUG,
                ACE_TEXT("ret[%d] recvLen[%d] : [%.*C]\n"),
                ret, recvLen, recvLen, buff) );
Client
 * 접속하자 마자 첫 메세지("Hello ")를 보내고(send_n)
 * 5초후 (sleep 5초) 나머지 데이터("World!")를 보내고 접속을 끊는다.
        peer.send_n( "Hello ", 6 );

        ACE_OS::sleep( 5 );
        peer.send_n( "World!" , 6 );
        peer.close();
 * 결과 :
 *  recv_n는 첫 메세지를 받고 timeout(10초)동안 블럭이 걸려있었으며
 *  5초후 나머지 데이터를 받고 0을 반환후에 종료하였습니다.
 *  받은 데이터 사이즈는 recv_n 4번째 인자로 받습니다.
$ ./recv
ret[0] recvLen[12] : [Hello World!]
서버 소스 Recv.C
/*
 * 10초간 recv를 걸어놓고 받는것을 테스트함.
 *
 * 상대방에서는(send.C) 접속하자 마자 첫 메세지를 보내고
 * 5초간 sleep를 준다음 나머지 데이터를 보내고 접속을 끊는다.
 *
 * 결과 :
 *  recv_n는 첫 메세지를 받고 timeout(10초)동안 블럭이 걸려있었으며
 *  5초후 나머지 데이터를 받고 0을 반환후에 종료하였습니다.
 *  받은 데이터 사이즈는 recv_n 4번째 인자로 받습니다.
 */
#include <ace/SOCK_Stream.h>
#include <ace/INET_Addr.h>
#include <ace/SOCK_Acceptor.h>
#include <ace/Time_Value.h>
#include <ace/Log_Msg.h>

int ACE_TMAIN( int, ACE_TCHAR * [] )
{
        ACE_INET_Addr   myaddr(9090);

        ACE_SOCK_Acceptor       acceptor;

        if( acceptor.open( myaddr ) == -1 )
        {
                ACE_ERROR_RETURN( (LM_ERROR, ACE_TEXT("%p\n"), ACE_TEXT("acceptor.open()")), 1 );
        }

        ACE_OS::sleep(5);
        ACE_SOCK_Stream peer;
        if( acceptor.accept( peer ) == -1 )
        {
                ACE_ERROR_RETURN( (LM_ERROR, ACE_TEXT("%p\n"), ACE_TEXT("acceptor.accept()")), 1 );
        }

        char    buff[1024];
        size_t  recvLen = 0;
        ACE_Time_Value  timeout(10);
        int ret = peer.recv_n( buff, sizeof(buff)-1, &timeout, &recvLen );
        if( ret == -1 )
        {
                ACE_ERROR_RETURN( (LM_ERROR, ACE_TEXT("%p\n"), ACE_TEXT("recv_n()")), 1 );
        }

        ACE_DEBUG( (LM_DEBUG, ACE_TEXT("ret[%d] recvLen[%d] : [%.*C]\n"), ret, recvLen, recvLen, buff) );
        peer.close();

        return 0;
}
클라이언트 소스
send.C
/*
 * 서버에 접속하자 마자 첫 메세지("Hello ")를 보내고
 * 5초간 sleep를 준다음 나머지 데이터( "World!\n")를 보내고 접속을 끊는다.
 */

#include <ace/SOCK_Stream.h>
#include <ace/INET_Addr.h>
#include <ace/SOCK_Connector.h>
#include <ace/Time_Value.h>
#include <ace/Log_Msg.h>
#include <ace/OS.h>

int ACE_TMAIN( int, ACE_TCHAR * [] )
{
        ACE_INET_Addr   svrAddr(9090, ACE_TEXT("127.0.0.1"));

        ACE_SOCK_Connector      conn;

        ACE_SOCK_Stream peer;
        if( conn.connect( peer, svrAddr ) == -1 )
        {
                ACE_ERROR_RETURN( (LM_ERROR, ACE_TEXT("%p\n"), ACE_TEXT("connect()")), 1 );
        }

        char    buff[1024];
        ACE_OS::strcpy( buff, "Hello " );
        if( peer.send_n( buff, ACE_OS::strlen(buff) ) == -1 )
        {
                ACE_ERROR_RETURN( (LM_ERROR, ACE_TEXT("%p\n"), ACE_TEXT("send_n() 2")), 1 );
        }

        ACE_OS::sleep( 5 );
        ACE_OS::strcpy( buff, "World!" );
        if( peer.send_n( buff, ACE_OS::strlen(buff) ) == -1 )
        {
                ACE_ERROR_RETURN( (LM_ERROR, ACE_TEXT("%p\n"), ACE_TEXT("send_n() 1")), 1 );
        }

        peer.close();

        return 0;
}

결과
$ ./recv
ret[0] recvLen[12] : [Hello World!]

+ Recent posts