📄 client.cpp
字号:
// $Id: client.cpp 79394 2007-08-18 16:40:18Z mesnier_p $// ===========================================================================//// = LIBRARY// tests//// = FILENAME// Send_Recv_Test.cpp//// = DESCRIPTION This is a test of the <ACE_SOCK>'s various send and// receive methods, over HTBP. The test forks two processes or spawns// two threads (depending upon the platform) and then executes client// and server allowing them to connect and exchange data in ways// designed to exercise the send and recv functions.//// Right now, it primarily tests the iov-like send and recv// functions, but others should be added to completely cover the// possible scenarios.//// = AUTHOR// Steve Huston <shuston@riverace.com>//// ============================================================================#include "ace/HTBP/HTBP_Stream.h"#include "ace/HTBP/HTBP_Session.h"#include "ace/HTBP/HTBP_ID_Requestor.h"#include "ace/HTBP/HTBP_Environment.h"#include "ace/OS.h"#include "ace/Thread.h"#include "ace/Thread_Manager.h"#include "ace/SOCK_Connector.h"#include "ace/SOCK_Acceptor.h"#include "ace/SOCK_Stream.h"#include "ace/Get_Opt.h"// Change to non-zero if test failsstatic int Test_Result = 0;const size_t Test3_Send_Size = 4*1024;const size_t Test3_Loops = 10;const size_t Test3_Total_Size = Test3_Send_Size * Test3_Loops;const ACE_TCHAR * remote_host = 0;const ACE_TCHAR * config_file = 0;unsigned remote_port = 8088;intparse_args (int argc, ACE_TCHAR *argv[]){ ACE_Get_Opt get_opts (argc, argv, ACE_TEXT("p:h:c:")); int c; while ((c = get_opts ()) != -1) switch (c) { case 'p': remote_port = static_cast<unsigned>(ACE_OS::atoi (get_opts.opt_arg())); break; case 'h': remote_host = get_opts.opt_arg (); break; case 'c': config_file = get_opts.opt_arg (); break; case '?': default: ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("usage: %s ") ACE_TEXT ("-h remote_host ") ACE_TEXT ("-p remote_port ") ACE_TEXT ("-c config_file ") ACE_TEXT ("\n"), argv [0]), -1); } // Indicates sucessful parsing of the command line return 0;}intACE_TMAIN (int argc, ACE_TCHAR *argv[]){ ACE_OS::socket_init (ACE_WSOCK_VERSION); if (parse_args(argc, argv) != 0) return 1; if (remote_host == 0) ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("Client: No remote host specified\n")),1); ACE::HTBP::Environment env; if (config_file != 0) env.import_config (config_file); ACE::HTBP::ID_Requestor req (&env); ACE::HTBP::Addr local(ACE_TEXT_ALWAYS_CHAR(req.get_HTID())); unsigned proxy_port = 0; ACE_TString proxy_host; if (env.get_proxy_port(proxy_port) != 0 || env.get_proxy_host(proxy_host) != 0) { ACE_DEBUG ((LM_DEBUG, ACE_TEXT("(%P|%t) Client: ") ACE_TEXT("no proxy address in ") ACE_TEXT("config, using direct connect\n"))); proxy_port = remote_port; proxy_host = remote_host; } ACE_INET_Addr proxy(proxy_port,proxy_host.c_str()); ACE::HTBP::Addr remote (remote_port, ACE_TEXT_ALWAYS_CHAR(remote_host)); ACE::HTBP::Session session(remote, local, ACE::HTBP::Session::next_session_id(), &proxy); ACE::HTBP::Stream stream(&session); ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%P|%t) Connecting to port %d\n"), remote.get_port_number())); ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%P|%t) connected to %s\n"), ACE_TEXT_CHAR_TO_TCHAR(remote.get_host_name ()))); ACE_DEBUG ((LM_DEBUG, "(%P) ***** client TEST 1 ***** \n")); //******************* TEST 1 ****************************** // // Do a iovec sendv - send the 255 byte buffer in 5 chunks. The // server will verify that the correct data is sent, and that there // is no more and no less. u_char buffer[255]; size_t i; ssize_t len; // The server will verify that this data pattern gets there intact. for (i = 0; i < sizeof buffer; ++i) buffer[i] = static_cast<u_char> (i); iovec iov[5]; iov[0].iov_base = reinterpret_cast<char *> (&buffer[0]); iov[0].iov_len = 50; iov[1].iov_base = reinterpret_cast<char *> (&buffer[50]); iov[1].iov_len = 25; iov[2].iov_base = reinterpret_cast<char *> (&buffer[75]); iov[2].iov_len = 150; iov[3].iov_base = reinterpret_cast<char *> (&buffer[225]); iov[3].iov_len = 29; iov[4].iov_base = reinterpret_cast<char *> (&buffer[254]); iov[4].iov_len = 1; len = stream.sendv (iov, 5); ACE_DEBUG ((LM_DEBUG,"(%P) after send, len = %d\n")); if (len == -1) { ACE_ERROR ((LM_ERROR, ACE_TEXT ("(%P|%t) %p\n"), ACE_TEXT ("Test 1, sendv failed"))); Test_Result = 1; } else if (len != 255) { ACE_ERROR ((LM_ERROR, ACE_TEXT ("(%P|%t) %p\n"), ACE_TEXT ("Test 1, len = %d != 255\n"), len)); Test_Result = 1; } // ACE_OS::sleep (10); ACE_DEBUG ((LM_DEBUG, "(%P) ***** client TEST 2 ***** \n")); //******************* TEST 2 ****************************** // // The same data is coming back - receive it using recv (size_t n, // ...) and compare it to the original data. u_char buffer2[255]; ssize_t total = 0; do { len = stream.recv (buffer2+total, 145 - total); ACE_DEBUG ((LM_DEBUG, ACE_TEXT("(%P) Test 2: want %d bytes, got %d\n"), 145 - total,len)); if (len == -1 || errno == EWOULDBLOCK) ACE_OS::sleep (1); else total += len; } while ((len == -1 && errno == EWOULDBLOCK) || total < 145); if (total != 145) Test_Result = 1; len = stream.recv (buffer2 + total, 110); ACE_DEBUG ((LM_DEBUG, ACE_TEXT("(%P) Test 2: second read want 110 bytes, got %d\n"), len)); if (len != 110) Test_Result = 1; for (i = 0; Test_Result == 0 && i < 255; i++) if (buffer2[i] != buffer[i]) { ACE_ERROR ((LM_ERROR, ACE_TEXT ("(%P|%t) Test 2, rcvd byte %d is %d, not %d\n"), i, buffer2[i], buffer[i])); Test_Result = 1; } stream.close (); return Test_Result;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -