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!]