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