From 6dbf38a923b9b902e2a75f0c9f157450816d7d95 Mon Sep 17 00:00:00 2001
From: wangzhengquan <wangzhengquan85@126.com>
Date: 星期四, 23 七月 2020 18:07:49 +0800
Subject: [PATCH] update

---
 src/socket/shm_socket.c |   37 +++++++++++++++++++++++++++++++------
 1 files changed, 31 insertions(+), 6 deletions(-)

diff --git a/src/socket/shm_socket.c b/src/socket/shm_socket.c
index 3d7ba4e..185ecaf 100644
--- a/src/socket/shm_socket.c
+++ b/src/socket/shm_socket.c
@@ -96,7 +96,8 @@
 
 // print_msg("===accept:", src);
 		client_port = src.port;
-		client_socket = (shm_socket_t *)malloc(sizeof(shm_socket_t));
+		// client_socket = (shm_socket_t *)malloc(sizeof(shm_socket_t));
+		client_socket = shm_open_socket(socket->socket_type);
 		client_socket->port = socket->port;
 		// client_socket->queue= socket->queue;
 		//鍒濆鍖栨秷鎭痲ueue
@@ -211,7 +212,7 @@
 
 int shm_recv(shm_socket_t* socket, void **buf, int *size) {
 	if(socket->socket_type != SHM_SOCKET_STREAM) {
-		err_exit(0, "can not invoke shm_recv method with a socket which is not a SHM_SOCKET_STREAM socket");
+		err_exit(0, "can not invoke shm_recv method in a %d type socket  which is not a SHM_SOCKET_STREAM socket ", socket->socket_type);
 	}
 	shm_msg_t src;
 
@@ -232,6 +233,9 @@
 
 // 鐭繛鎺ユ柟寮忓彂閫�
 int shm_sendto(shm_socket_t *socket, const void *buf, const int size, const int port) {
+	if(socket->socket_type != SHM_SOCKET_DGRAM) {
+		err_exit(0, "Can't invoke shm_sendto method in a %d type socket  which is not a SHM_SOCKET_DGRAM socket ", socket->socket_type);
+	}
 	hashtable_t *hashtable = mm_get_hashtable();
 
 	if(socket->queue == NULL) {
@@ -272,6 +276,9 @@
 
 // 鐭繛鎺ユ柟寮忔帴鍙�
 int shm_recvfrom(shm_socket_t *socket, void **buf, int *size, int *port){
+	if(socket->socket_type != SHM_SOCKET_DGRAM) {
+		err_exit(0, "Can't invoke shm_recvfrom method in a %d type socket  which is not a SHM_SOCKET_DGRAM socket ", socket->socket_type);
+	}
 	hashtable_t *hashtable = mm_get_hashtable();
 	if(socket->queue == NULL) {
 		if(socket->port == -1) {
@@ -287,7 +294,7 @@
 	}
 
 	shm_msg_t src;
-printf("shm_recvfrom pop before");
+// printf("shm_recvfrom pop before");
 	if (socket->queue->pop(src)) {
 		void * _buf = malloc(src.size);
 		memcpy(_buf, src.buf, src.size);
@@ -295,11 +302,27 @@
 		*size = src.size;
 		*port = src.port;
 		mm_free(src.buf);
-printf("shm_recvfrom pop after");
+// printf("shm_recvfrom pop after");
 		return 0;
 	} else {
 		return -1;
 	}
+}
+
+int shm_sendandrecv(shm_socket_t *socket, const void *send_buf, const int send_size, const int send_port, void **recv_buf, int *recv_size) {
+	if(socket->socket_type != SHM_SOCKET_DGRAM) {
+		err_exit(0, "Can't invoke shm_sendandrecv method in a %d type socket  which is not a SHM_SOCKET_DGRAM socket ", socket->socket_type);
+	}
+	int recv_port;
+	int rv;
+
+	shm_socket_t *tmp_socket = shm_open_socket(SHM_SOCKET_DGRAM);
+	if (shm_sendto(tmp_socket, send_buf, send_size, send_port) == 0) {
+		rv = shm_recvfrom(tmp_socket, recv_buf, recv_size, &recv_port);
+		shm_close_socket(tmp_socket);
+		return rv;
+	}
+	return -1;
 }
 
 
@@ -323,11 +346,13 @@
 
 void _server_close_conn_to_client(shm_socket_t* socket, int port) {
 	shm_socket_t *client_socket;
-	auto iter = socket->clientSocketMap->find(port);
+	std::map<int, shm_socket_t* >::iterator iter = socket->clientSocketMap->find(port);
 	if( iter !=  socket->clientSocketMap->end() ) {
+		client_socket = iter->second;
+		free((void *)client_socket);
 		socket->clientSocketMap->erase(iter);
 	}
-	//free((void *)client_socket);
+	
 
 }
 

--
Gitblit v1.8.0