From f75a37444e7a97fb58439077eea4d1b3c576bfe3 Mon Sep 17 00:00:00 2001 From: wangzhengquan <wangzhengquan85@126.com> Date: 星期一, 20 七月 2020 11:17:33 +0800 Subject: [PATCH] update --- test/communication.c | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 105 insertions(+), 11 deletions(-) diff --git a/test/communication.c b/test/communication.c index a314dcb..eae99d4 100644 --- a/test/communication.c +++ b/test/communication.c @@ -1,5 +1,10 @@ -#include "socket.h" - +#include "shm_socket.h" +#include "usg_common.h" +#include "shm_mm.h" +typedef struct Targ { + int port; + int id; +}Targ; void * precess_client(void *_socket) { pthread_detach(pthread_self()); @@ -7,13 +12,11 @@ int size; void *recvbuf; char sendbuf[512]; - while(true) { - shm_recv(socket, &recvbuf, &size); + while (shm_recv(socket, &recvbuf, &size) == 0 ) { sprintf(sendbuf, "SERVER RECEIVED: %s", recvbuf); puts(sendbuf); - shm_send(socket, sendbuf, strlen(sendbuf)+1) ; - shm_free(recvbuf); - + shm_send(socket, sendbuf, strlen(sendbuf)+1); + free(recvbuf); } shm_close_socket(socket); } @@ -21,12 +24,12 @@ void server(int port) { pthread_t tid; shm_socket_t *socket = shm_open_socket(); - shm_bind(socket, port); + shm_socket_bind(socket, port); shm_listen(socket); shm_socket_t *client_socket; while(true) { client_socket = shm_accept(socket); -printf("server messageQueue = %p\n", client_socket->messageQueue); +// printf("server messageQueue = %p\n", client_socket->messageQueue); pthread_create(&tid, NULL, precess_client , (void *)client_socket); } @@ -45,10 +48,97 @@ shm_send(socket, sendbuf, strlen(sendbuf)+1) ; shm_recv(socket, &recvbuf, &size); printf("reply: %s\n", (char *)recvbuf); - shm_free(recvbuf); + free(recvbuf); } shm_close_socket(socket); +} + +void client_send(shm_socket_t *socket, char *sendbuf) { + + int size; + void *recvbuf; + printf("requst:%s\n", sendbuf); + shm_send(socket, sendbuf, strlen(sendbuf)+1) ; + shm_recv(socket, &recvbuf, &size); + printf("reply: %s\n", (char *)recvbuf); + free(recvbuf); + + +} + + +void multyProcessorsClient(int port) { + + int status, i = 0, processors = 4, scale = 100000; + pid_t productors[processors]; + pid_t pid; + char sendbuf[512]; + for ( i = 0; i < processors; i++) { + if ((productors[i] = fork()) == 0) /* Child runs user job */ + { + shm_socket_t *socket = shm_open_socket(); + shm_connect(socket, port); + while( scale-- > 0) { + sprintf(sendbuf, "processor(%d) %d", i, scale); + client_send(socket, sendbuf); + } + shm_close_socket(socket); + exit(0); + } + } + + while ((pid = waitpid(-1, &status, 0)) > 0) { + if(WIFEXITED(status)) { + //fprintf(stderr, "child %d terminated normally with exit status=%d\n", pid, WEXITSTATUS(status)); + }else + fprintf(stderr, "child %d terminated abnormally\n", pid); + } + + if (errno != ECHILD) + perror("waitpid error"); +} + +void *threadrun(void *arg) { + Targ * targ = ( Targ * )arg; + int port = targ->port; + char sendbuf[512]; + int scale = 100000; + int i; + shm_socket_t *socket = shm_open_socket(); + shm_connect(socket, port); + for( i = 0; i<scale; i++) { + sprintf(sendbuf, "thread(%d) %d", targ->id, i); + + client_send(socket, sendbuf); + } + shm_close_socket(socket); + return (void*)i; +} + +void multyThreadClient(int port) { + + int status, i = 0, processors = 4; + void *res[processors]; + Targ *targs= (Targ*)calloc(processors, sizeof(Targ)); + pthread_t tids[processors]; + char sendbuf[512]; + for ( i = 0; i < processors; i++) { + targs[i].port = port; + targs[i].id = i; + pthread_create(&tids[i], NULL, threadrun, (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]); + } + } + + } int main(int argc, char *argv[]) { @@ -67,7 +157,11 @@ if (strcmp("client", argv[1]) == 0) client(port); - shm_destroy(); + + if (strcmp("mclient", argv[1]) == 0) + multyThreadClient(port); + + shm_destroy(); // fprintf(stderr, "Usage: reqrep %s|%s <URL> ...\n", "server", "client"); return 0; } \ No newline at end of file -- Gitblit v1.8.0