#include "dgram_mod_socket.h" #include "shm_mm.h" #include "usg_common.h" typedef struct Targ { int port; int id; }Targ; void sigint_handler(int sig) { //dgram_mod_close_socket(server_socket); printf("===Catch sigint======================\n"); shm_destroy(); exit(0); } void server(int port) { void *socket = dgram_mod_open_socket(); dgram_mod_bind(socket, port); int size; void *recvbuf; char sendbuf[512]; int rv; int remote_port; while (true) { if ((rv = dgram_mod_recvfrom_timeout(socket, &recvbuf, &size, &remote_port, 15, 0) ) == 0) { printf( "RECEIVED HREARTBEAT FROM %d: %s\n", remote_port, recvbuf); free(recvbuf); } } dgram_mod_close_socket(socket); } void client(int port) { void *socket = dgram_mod_open_socket(); int size; char sendbuf[512]; long i = 0; while (true) { sprintf(sendbuf, "%d", i); printf("SEND HEART:%s\n", sendbuf); dgram_mod_sendto(socket, sendbuf, strlen(sendbuf) + 1, port); // sleep(1); i++; } dgram_mod_close_socket(socket); } void *runclient(void *arg) { signal(SIGINT, sigint_handler); Targ *targ = (Targ *)arg; int port = targ->port; void *socket = dgram_mod_open_socket(); int size; char sendbuf[512]; long scale = 10; long i = 0; while (i < scale) { sprintf(sendbuf, "%d", i); printf("%d SEND HEART:%s\n", targ->id, sendbuf); dgram_mod_sendto(socket, sendbuf, strlen(sendbuf) + 1, port); sleep(1); i++; } dgram_mod_close_socket(socket); return (void *)i; } void startClients(int port) { int status, i = 0, processors = 100; void *res[processors]; Targ *targs = (Targ *)calloc(processors, sizeof(Targ)); pthread_t tids[processors]; char sendbuf[512]; struct timeval start; gettimeofday(&start, NULL); for (i = 0; i < processors; i++) { targs[i].port = port; targs[i].id = i; pthread_create(&tids[i], NULL, runclient, (void *)&targs[i]); } for (i = 0; i < processors; i++) { if (pthread_join(tids[i], &res[i]) != 0) { perror("multyThreadClient pthread_join"); } else { fprintf(stderr, "client(%d) 发送 %ld 条数据\n", i, (long)res[i]); } } struct timeval end; gettimeofday(&end, NULL); double difftime = end.tv_sec * 1000000 + end.tv_usec - (start.tv_sec * 1000000 + start.tv_usec); long diffsec = (long) (difftime/1000000); long diffmsec = difftime - diffsec*1000000; printf("cost: %ld sec: %ld msc\n", diffsec, diffmsec); } int main(int argc, char *argv[]) { shm_init(512); int port; if (argc < 3) { fprintf(stderr, "Usage: reqrep %s|%s ...\n", "server", "client"); return 1; } port = atoi(argv[2]); if (strcmp("server", argv[1]) == 0) { server(port); } if (strcmp("client", argv[1]) == 0) client(port); shm_destroy(); return 0; }