#include #include #include #include "easy_kfc_handler.h" #include #include #include #include #include #include #include using namespace std; static string g_servername = "127.0.0.1"; static string g_clientname = "127.0.0.1"; static string g_role = "server"; static string g_port = "2200"; static string g_group = "test2"; static string g_config = ""; static string g_setiplist = ""; static int g_msgsize = 1024; static int g_timeout = 300; static int g_sleep = 0; static bool g_verbose = false; static bool g_recvbuff = false; static bool g_serverasync = false; static uint64_t g_recvnum = 0; static uint64_t g_maxcount = 0; static int server_process(easy_request_t *r) { if(g_sleep > 0) { usleep(g_sleep); } easy_kfc_packet_t *ipacket = (easy_kfc_packet_t *)r->ipacket; easy_kfc_packet_t *opacket; opacket = easy_kfc_packet_rnew(r, ipacket->len); memcpy(opacket->data, ipacket->data, ipacket->len); //*((uint64_t *)opacket->data) = ipacket->chid; opacket->len = ipacket->len; opacket->chid = ipacket->chid; r->opacket = opacket; if(g_verbose) { fprintf(stdout, "Get MSG Length %d \n", ipacket->len); fprintf(stdout, "Get MSG: %s \n", ipacket->data); fprintf(stdout, "Send MSG: %s \n", opacket->data); } g_recvnum ++; if(g_recvnum % 1000 == 0) { fprintf(stdout, "Got %" PRIdFAST64 " MSGs. \n", g_recvnum); } return EASY_OK; } static int server_process_async(easy_request_t *r, void *args) { if(g_verbose) { fprintf(stdout, "\nserver process aync mode\n"); } return server_process(r); } void do_server(easy_kfc_t *kfc) { int ret; if(g_serverasync) { ret = easy_kfc_join_server_async(kfc, g_group.c_str(), 5, server_process_async); } else { ret = easy_kfc_join_server(kfc, g_group.c_str(), server_process); } if (ret == EASY_OK) { easy_kfc_start(kfc); } else { fprintf(stderr, "join server error!!!"); } } void *do_client(void *args) { easy_kfc_t *kfc = (easy_kfc_t *)args; easy_kfc_agent_t *ka = easy_kfc_join_client(kfc, g_group.c_str()); if (ka == NULL) { fprintf(stderr, "join client error!!!"); exit(-1); } char data1[g_msgsize]; char data2[g_msgsize]; memset(data1, '\0', g_msgsize); memset(data2, '\0', g_msgsize); data1[g_msgsize - 1] = '\0'; char *data3 = NULL; uint64_t count = 0; int ret; while(kfc->eio->stoped == 0 && count < g_maxcount) { struct timeval beforetime, senttime, aftertime, responsetime; gettimeofday(&beforetime, NULL); snprintf(data1, 32, "%" PRId64, count); if (easy_kfc_send_message(ka, data1, g_msgsize, g_timeout) == EASY_OK) { gettimeofday(&senttime, NULL); if (g_recvbuff == true) { ret = easy_kfc_recv_buffer(ka, &data3 ); } else { ret = easy_kfc_recv_message(ka, data2, g_msgsize); } if (ret > 0) { gettimeofday(&aftertime, NULL); if(string(data1) != string(data2)) cout << "SEND MSG IS DIFFERENT WITH RECV MSG" << endl; if(g_verbose) { printf("Sent MSG:\t%s\n", data1); cout << "Recv MSG:\t" << string(data2) << endl; printf("ret is:\t%d\n", ret); printf("Sent/Recv MSG LEN:\t%u\n", g_msgsize); timersub(&aftertime, &beforetime, &responsetime); unsigned timeused = responsetime.tv_sec * 1000000 + responsetime.tv_usec; printf("time used:\t%u\n", timeused); timersub(&senttime, &beforetime, &responsetime); unsigned timesent = responsetime.tv_sec * 1000000 + responsetime.tv_usec; printf("time sent:\t%u\n", timesent); timersub(&aftertime, &senttime, &responsetime); unsigned timerecv = responsetime.tv_sec * 1000000 + responsetime.tv_usec; printf("time recv:\t%u\n", timerecv); } } else { printf("easy_kfc_recv_message return value:\t%d\n", ret); //printf("easy_kfc_recv_message return value < 0"); } } count ++; if(g_setiplist != "" && count == g_maxcount / 2 ) { char config[1024]; snprintf(config, 1024, "%s", g_setiplist.c_str() ); printf("new config is:\n%s\n", config); if(EASY_ERROR == easy_kfc_set_iplist(kfc, config)) { fprintf(stderr, "easy kfc set iplist ERROR!!!"); exit(-1); } } } easy_kfc_leave_client(ka); if (g_recvbuff == true) easy_kfc_clear_buffer(ka); return (void *)NULL; } static void getconfig(string &config) { std::replace(config.begin(), config.end(), ';', '\n'); } static void usage() { cout << "Usage: []" << endl; cout << "Where are:" << endl; cout << " -r The role of running tool, the default role is server" << endl; cout << " -s The hostname/ip of the server, the default hostname is \"127.0.0.1\"" << endl; cout << " -c The hostname/ip of the client, the default hostname is \"127.0.0.1\"" << endl; cout << " -p The port of the server listen, the default port is \"2200\"" << endl; cout << " -g The group name of the server, the default group name is \"test2\"" << endl; cout << " -b The bytes of send message size, the default is 1024" << endl; cout << " -t The timeout in milliseconds, the default is 300" << endl; cout << " -n Request count number, default is 1000" << endl; cout << " -l Server sleep time in micro-second, default is 0" << endl; cout << " -v Show verbose detail of process" << endl; cout << " -a Server process in async mode" << endl; cout << " -f config file, like \"127.0.0.1 role=server group=test2 port=2200;127.0.0.1 role=client group=test2 port=2200\" " << endl; cout << " -e config file, setiplist, like \"127.0.0.1 role=server group=test2 port=2200;127.0.0.1 role=client group=test2 port=2200\" " << endl; exit(-1); } int main(int argc, char **argv) { char config[1024]; easy_kfc_t *kfc; if (argc < 3) { usage(); return 1; } while (true) { int c = getopt(argc, argv, "r:s:c:p:g:b:t:n:l:f:e:vah"); if (c == -1) break; switch (c) { case 'r': g_role = optarg; break; case 's': g_servername = optarg; break; case 'c': g_clientname = optarg; break; case 'p': g_port = optarg; break; case 'g': g_group = optarg; break; case 'b': g_msgsize = atoi(optarg); break; case 't': g_timeout = atoi(optarg); break; case 'n': g_maxcount = atoi(optarg); break; case 'l': g_sleep = atoi(optarg); break; case 'f': g_config = string(optarg); getconfig(g_config); break; case 'e': g_setiplist = string(optarg); getconfig(g_setiplist); break; case 'a': g_serverasync = true; break; case 'v': g_verbose = true; break; case '?': case ':': default: break; } } cout << "msg size is:\t" << g_msgsize << endl; cout << "max count is:\t" << g_maxcount << endl; cout << "timeout value:\t" << g_timeout << endl; cout << "server sleep time:\t" << g_sleep << endl; // config snprintf(config, 1024, "%s role=server group=%s port=%s\n" "%s role=client group=%s port=%s\n", g_servername.c_str(), g_group.c_str(), g_port.c_str(), g_clientname.c_str(), g_group.c_str(), g_port.c_str() ); if(g_config != "") snprintf(config, 1024, "%s", g_config.c_str() ); printf("config is:\n%s\n", config); // server if (g_role == "server") { if ((kfc = easy_kfc_create(config, 0)) == NULL) { fprintf(stderr, "easy kfc create ERROR!!!\n"); return -1; } do_server(kfc); } else if (g_role == "client") { if ((kfc = easy_kfc_create(config, 1)) == NULL) { fprintf(stderr, "easy kfc create ERROR!!!\n"); return -1; } easy_kfc_start(kfc); do_client(kfc); easy_eio_stop(kfc->eio); } else { usage(); } easy_kfc_wait(kfc); easy_kfc_destroy(kfc); return 0; }