diff options
author | rainbow_0206 <jiangwenjiang@huawei.com> | 2018-04-26 16:47:40 +0800 |
---|---|---|
committer | rainbow_0206 <jiangwenjiang@huawei.com> | 2018-05-07 19:26:12 +0800 |
commit | e03ec1c93e894e6c4503f664d338277bef0f03f2 (patch) | |
tree | d9974d4f0063e9ba7a9a9e295da731416bcb4b61 /app_example/perf-test/multi_tcp_common_app_Cli.c | |
parent | 9baaa1fecb183d9d03b40b7d21f96d9af256521f (diff) |
Add a server implemented by select and modify the name of client
Change-Id: Ib3d79acdead61173c3c5bd4c291a24c80faf6624
Signed-off-by: rainbow_0206 <jiangwenjiang@huawei.com>
Diffstat (limited to 'app_example/perf-test/multi_tcp_common_app_Cli.c')
-rw-r--r-- | app_example/perf-test/multi_tcp_common_app_Cli.c | 396 |
1 files changed, 396 insertions, 0 deletions
diff --git a/app_example/perf-test/multi_tcp_common_app_Cli.c b/app_example/perf-test/multi_tcp_common_app_Cli.c new file mode 100644 index 0000000..5c1fada --- /dev/null +++ b/app_example/perf-test/multi_tcp_common_app_Cli.c @@ -0,0 +1,396 @@ +/* +* +* Copyright (c) 2018 Huawei Technologies Co.,Ltd. +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at: +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +#define _GNU_SOURCE +#include <sys/socket.h> +#include <fcntl.h> +#include <memory.h> +#include <signal.h> +#include <stdio.h> +#include <unistd.h> +#include <stdio.h> +#include <stdlib.h> +#include <sys/stat.h> +#include <netinet/in.h> +#include <time.h> +#include <linux/tcp.h> +#include <sched.h> +#include <pthread.h> +#include <arpa/inet.h> +#include <sys/epoll.h> +#include <errno.h> + +#define _BIND bind +#define _LISTEN listen +#define _SOCKET socket +#define _ACCEPT accept +#define _SEND send +#define _RECV recv +#define _CLOSE close +#define _CONNECT connect +#define _PROTOCOL IPPROTO_TCP + +#define MAX_TEST_TIME 1000 +#define MSG_LENGTH 256 +#define CORE_NUM 8 +#define START_CPU_ID 2 +#define MAX_CONN_LIMIT 256 +#define MAX_PORT_NUM 65535 +//1:A-B ;0:A-B-A +#define SEND_RECV_MODE 1 +#define MAX_EVENTS 1000 +#define Default_PortID 12345 +#define Default_SleepCnt 10000 +#define Default_SleepTime 1000000 +#define Flag_Print 1 +#define Fd_Number 1 + +static struct sockaddr_in g_dest; +static struct sockaddr_in g_src; +static struct sockaddr_in g_recv; + +int times = MAX_TEST_TIME; +int msg_length = MSG_LENGTH; +int coreNum = CORE_NUM; +int startCPUId = START_CPU_ID; +int connectNum = MAX_CONN_LIMIT; +int msgMode = SEND_RECV_MODE; +int sleepCnt = Default_SleepCnt; +int sleepTime = Default_SleepTime; //us +int fdNumber = Fd_Number; +int flagPrint = Flag_Print; +int unitPrint = 0; +int waitTime = 0; + +int srcPort = Default_PortID; +int destPort = 0; +int recvPort = 0; +char sendarr[256] = ""; +char recvarr[256] = ""; +char destarr[256] = ""; + +static void +setArgsDefault () +{ + + memset (&g_dest, 0, sizeof (g_dest)); + g_dest.sin_family = AF_INET; + g_dest.sin_addr.s_addr = inet_addr ("127.0.0.1"); + g_dest.sin_port = htons (12345); + bzero (&(g_dest.sin_zero), 8); + + memset (&g_src, 0, sizeof (g_src)); + g_src.sin_family = AF_INET; + g_src.sin_addr.s_addr = inet_addr ("0.0.0.0"); + g_src.sin_port = htons (7895); + bzero (&(g_src.sin_zero), 8); + + memset (&g_recv, 0, sizeof (g_recv)); + g_recv.sin_family = AF_INET; + g_recv.sin_addr.s_addr = inet_addr ("0.0.0.0"); + g_recv.sin_port = htons (7895); + bzero (&(g_recv.sin_zero), 8); + +} + +static int +process_arg (int argc, char *argv[]) +{ + int opt = 0; + int error = 0; + const char *optstring = "p:d:s:a:l:t:e:i:f:r:n:w:u:x:"; + int rw_mark = 0; + + if (argc < 4) + { + printf + ("Param info :-p dest_portid; -d dest_serverIP; -a src_portid; -s src_clientIP; -l msg_length; \n"); + printf + ("\t-t MAX_TEST_TIME; -i msg_interval ; -f client fd number ; -r receive port; -n connectNum(one server vs n client)\n"); + return 0; + } + while ((opt = getopt (argc, argv, optstring)) != -1) + { + switch (opt) + { + case 'p': + destPort = atoi (optarg); + g_dest.sin_port = htons (atoi (optarg)); + break; + case 'd': + stpcpy (destarr, optarg); + g_dest.sin_addr.s_addr = inet_addr (optarg); + break; + case 's': + stpcpy (sendarr, optarg); + g_src.sin_addr.s_addr = inet_addr (optarg); + g_recv.sin_addr.s_addr = inet_addr (optarg); + break; + case 'a': + //g_src.sin_port = htons(atoi(optarg)); + srcPort = atoi (optarg); + break; + case 'l': + msg_length = atoi (optarg); + break; + case 't': + times = atoi (optarg); + break; + case 'e': + sleepCnt = atoi (optarg); + break; + case 'i': + sleepTime = atoi (optarg); + break; + case 'f': + fdNumber = atoi (optarg); + break; + case 'r': + recvPort = atoi (optarg); + g_recv.sin_port = htons (atoi (optarg)); + break; + case 'n': + connectNum = atoi (optarg); + break; + case 'w': + waitTime = atoi (optarg); + break; + case 'u': + unitPrint = atoi (optarg); + break; + case 'x': + flagPrint = atoi (optarg); + break; + + } + } + return 1; +} + +void +process_client (void) +{ + int sendLen = 0; + int i = 0, t = 0, p = 0, optval = 0, ret = 0; + char send_buf[1000] = ""; + char recv_buf[1000] = ""; + int c_socketfd[100] = { 0 }; + int errbind[1000] = { 0 }; + int errconn[1000] = { 0 }; + + int send_count[1000] = { 0 }; + int pps = 0; + long pps_time = 0; + + struct timespec startTime, endTime; + struct timespec countStart; + struct timespec countEnd; + memset (&countStart, 0, sizeof (countStart)); + memset (&countEnd, 0, sizeof (countEnd)); + + for (i = 0; i < fdNumber; i++) + { + c_socketfd[i] = _SOCKET (PF_INET, SOCK_STREAM, _PROTOCOL); + if (0 > c_socketfd[i]) + { + printf ("client %d failed,err %d\n", i, errno); + } + else + { + printf ("client %d created success\n", i); + } + } + + for (i = 0; i < fdNumber; i++) + { + optval = 1; + ret = + setsockopt (c_socketfd[i], SOL_SOCKET, SO_REUSEADDR, (void *) &optval, + sizeof (optval)); + if (ret == -1) + { + printf ("Couldn't setsockopt(SO_REUSEADDR)\n"); + break; + } + } + + for (i = 0; i < fdNumber; i++) + { + g_src.sin_port = htons (srcPort + i); + errbind[i] = + _BIND (c_socketfd[i], (struct sockaddr *) &g_src, sizeof (g_src)); + if (errbind[i] < 0) + { + printf ("client %d bind Failed %d\n", i, errno); + _CLOSE (c_socketfd[i]); + c_socketfd[i] = -1; + continue; + } + else + { + printf ("client %d bind Success port:%d IP:%s\n", i, + ntohs (g_src.sin_port), + inet_ntoa (*((struct in_addr *) &(g_src.sin_addr.s_addr)))); + } + } + for (i = 0; i < fdNumber; i++) + { + if (errbind[i] >= 0) + { + errconn[i] = + _CONNECT (c_socketfd[i], (struct sockaddr *) &g_dest, + sizeof (g_dest)); + if (errconn[i] < 0) + { + printf ("client %d Connect Failed %d\n", i, errno); + _CLOSE (c_socketfd[i]); + c_socketfd[i] = -1; + continue; + } + else + { + printf ("client %d Connect Success port:%d, IP:%s\n", i, + ntohs (g_dest.sin_port), + inet_ntoa (* + ((struct in_addr *) + &(g_dest.sin_addr.s_addr)))); + } + } + } + + sleep (1); + + clock_gettime (CLOCK_MONOTONIC, &startTime); + clock_gettime (CLOCK_MONOTONIC, &countStart); + + int recvLen2, recvLen; + for (t = 0; t < times; t++) + { + for (i = 0; i < fdNumber; i++) + { + if (c_socketfd[i] < 0) + { + continue; + } + do + { + sendLen = _SEND (c_socketfd[i], send_buf, msg_length, 0); + } + while (sendLen <= 0); + send_count[i]++; + recvLen = 0; + do + { + recvLen2 = + recv (c_socketfd[i], recv_buf + recvLen, msg_length - recvLen, + 0); + if (recvLen2 <= 0) + { + continue; + } + else if (recvLen2 == msg_length - recvLen) + { + recvLen = 0; + break; + } + else if (recvLen2 < msg_length - recvLen) + { + recvLen += recvLen2; + } + } + while (1); + } + + if (0 != sleepTime) + { + if ((t % sleepCnt) == 0) + { + usleep (sleepTime); + } + } + + if ((send_count[0] % unitPrint) == 0 && send_count[0] > 0) + { + clock_gettime (CLOCK_MONOTONIC, &countEnd); + + pps_time = + (countEnd.tv_sec - countStart.tv_sec) * 1000000000 + + countEnd.tv_nsec - countStart.tv_nsec; + pps = ((float) 1000000000 / pps_time) * unitPrint * fdNumber; + if ((flagPrint != 0)) + { + printf (" sendcount %d, time: %ld ns\n", + send_count[0] * fdNumber, pps_time); + } + printf ("sendcount %d , pps=%d\n", send_count[0] * fdNumber, pps); + clock_gettime (CLOCK_MONOTONIC, &countStart); + } + } + + clock_gettime (CLOCK_MONOTONIC, &endTime); + + for (i = 0; i < fdNumber; i++) + { + printf ("client %d send %d , sendtime :%ld s %ld ns\n", i, + send_count[i], endTime.tv_sec - startTime.tv_sec, + endTime.tv_nsec - startTime.tv_nsec); + } + + for (i = 0; i < fdNumber; i++) + { + printf ("client %d close!\n", i); + if (c_socketfd[i] > 0) + _CLOSE (c_socketfd[i]); + } + + pthread_exit (NULL); +} + +void +main (int argc, char *argv[]) +{ + socklen_t addrlen = sizeof (struct sockaddr); + int err = 0, result = 0, ret = 0; + int i = 0, j = 0, optval = 0, z = 0, x, listenfd; + cpu_set_t mask; + + setArgsDefault (); + ret = process_arg (argc, argv); + if (ret != 1) + { + printf ("The param error\n"); + return; + } + + pthread_t client_thread_id; + + if (pthread_create + (&client_thread_id, NULL, (void *) (&process_client), NULL) == -1) + { + printf ("create client thread fail\n"); + return; + } + + printf ("create client thread success\n"); + + if (client_thread_id != 0) + { + printf ("Client Thread join\n"); + pthread_join (client_thread_id, NULL); + } + + return; +} |