void OnCmdStart(CCommandParser* pParser) { if(!s_vtClients.empty()) { ::LogClientStartFail(SE_ILLEGAL_STATE, ::HP_GetSocketErrorDesc(SE_ILLEGAL_STATE)); return; } s_stat.Reset(); for(DWORD i = 0; i < g_app_arg.conn_count; i++) { CSSLClientPtr pSocket(&s_listener); if(!pSocket->SetupSSLContext(g_c_iVerifyMode, g_c_lpszPemCertFile, g_c_lpszPemKeyFile, g_c_lpszKeyPasswod, g_c_lpszCAPemCertFileOrPath)) { int iErrCode = ::SYS_GetLastError(); ::LogClientStartFail(iErrCode, _T("initialize SSL env fail")); ClearHPSocketPtrSet(s_vtClients); EXIT(EX_CONFIG, iErrCode); } pSocket->SetKeepAliveTime(g_app_arg.keep_alive ? TCP_KEEPALIVE_TIME : 0); if(pSocket->Start(g_app_arg.remote_addr, g_app_arg.port, g_app_arg.async)) s_vtClients.push_back(pSocket.Detach()); else { ::LogClientStartFail(pSocket->GetLastError(), pSocket->GetLastErrorDesc()); ClearHPSocketPtrSet(s_vtClients); return; } } ::LogClientStart(g_app_arg.remote_addr, g_app_arg.port); DWORD dwSendDelay = 3; CString strMsg; strMsg.Format(_T("*** willing to send data after %d seconds ***"), dwSendDelay); ::LogMsg(strMsg); ::WaitFor(dwSendDelay * 500); while(true) { int iConnected = s_stat.GetConnected(); if(iConnected < 0) { ClearHPSocketPtrSet(s_vtClients); ::LogClientStartFail(ERROR_CONNREFUSED, ::HP_GetSocketErrorDesc(SE_CONNECT_SERVER)); return; } else if(iConnected == (int)g_app_arg.conn_count) break; ::WaitFor(3); } ::WaitFor(dwSendDelay * 500); s_sendBuffer.Malloc(g_app_arg.data_length, true); ::LogMsg(_T("*** Go Now ! ***")); s_stat.StartTest(); BOOL bTerminated = FALSE; for(DWORD i = 0; i < g_app_arg.test_times; i++) { for(DWORD j = 0; j < g_app_arg.conn_count; j++) { ITcpClient* pSocket = s_vtClients[j]; if(!pSocket->Send(s_sendBuffer, (int)s_sendBuffer.Size())) { ::LogClientSendFail(i + 1, j + 1, ::SYS_GetLastError(), ::HP_GetSocketErrorDesc(SE_DATA_SEND)); bTerminated = TRUE; break; } } if(bTerminated) break; if(g_app_arg.test_interval > 0 && i + 1 < g_app_arg.test_times) ::WaitFor(g_app_arg.test_interval); } if(bTerminated) ClearHPSocketPtrSet(s_vtClients); s_sendBuffer.Free(); }