From af85260254bacac40a68d4f5f61950523beb3a27 Mon Sep 17 00:00:00 2001
From: wangzhengquan <wangzhengquan85@126.com>
Date: 星期一, 19 十月 2020 17:02:41 +0800
Subject: [PATCH] update

---
 src/socket/net_mod_server_socket.c |   80 ++++++++++++++++++++++++++++++----------
 1 files changed, 60 insertions(+), 20 deletions(-)

diff --git a/src/socket/net_mod_server_socket.c b/src/socket/net_mod_server_socket.c
index ccc17e2..51e10e9 100644
--- a/src/socket/net_mod_server_socket.c
+++ b/src/socket/net_mod_server_socket.c
@@ -4,37 +4,55 @@
 #include "net_mod_socket_io.h"
 #include "net_mod_socket.h"
  
-NetModServerSocket::NetModServerSocket(int port):max_buf(1024), max_topic_buf(256)
+NetModServerSocket::NetModServerSocket(int _port): listenfd(0), port(_port), max_buf(1024), max_topic_buf(256), max_response_buf(1024)
 {
-  char portstr[32];
-
-  //shmModSocket = new ShmModSocket;
-  sprintf(portstr, "%d", port);
-  listenfd = Open_listenfd(portstr);
-  init_pool(listenfd);
+  
 
   buf = malloc(max_buf);
   if(buf == NULL) {
-    err_exit(errno, "process_client malloc");
+    err_exit(errno, "NetModServerSocket::NetModServerSocket malloc");
   }
 
   topic_buf = malloc(max_topic_buf);
   if(topic_buf == NULL) {
-    err_exit(errno, "process_client malloc");
+    err_exit(errno, "NetModServerSocket::NetModServerSocket malloc");
+  }
+
+  response_buf = (char *) malloc(max_response_buf);
+  if(response_buf == NULL) {
+    err_exit(errno, "NetModServerSocket::NetModServerSocket malloc");
   }
 }
 
 
 NetModServerSocket::~NetModServerSocket() {
-   Close(listenfd);
-   free(buf);
+  if(listenfd != 0) {
+    Close(listenfd);
+  }
+  
+  if(buf != NULL)
+    free(buf);
+  if(topic_buf != NULL)
    free(topic_buf);
+  if(response_buf != NULL)
+   free(response_buf);
 }
 
-void NetModServerSocket::start() {
+int NetModServerSocket::start() {
 	int connfd;
 	socklen_t clientlen;
   struct sockaddr_storage clientaddr;
+  char portstr[32];
+
+  //shmModSocket = new ShmModSocket;
+  sprintf(portstr, "%d", port);
+  listenfd = open_listenfd(portstr);
+  if(listenfd < 0) {
+    LoggerFactory::getLogger()->error(errno, "NetModServerSocket::start");
+    return -1;
+  }
+  init_pool(listenfd);
+
 	while (1)
   {
     /* Wait for listening/connected descriptor(s) to become ready */
@@ -52,6 +70,7 @@
     /* Echo a text line from each ready connected descriptor */
     check_clients();
   }
+  return 0;
 }
 
 void  NetModServerSocket::init_pool(int listenfd)
@@ -105,8 +124,8 @@
   net_mod_response_head_t response_head;
   char request_head_bs[NET_MODE_REQUEST_HEAD_LENGTH];
   void  *recv_buf;
-char tmp[8196];
-  int recv_size;
+// char tmp[8196];
+  int recv_size, response_buf_size;
 
   if (rio_readn(connfd, request_head_bs, NET_MODE_REQUEST_HEAD_LENGTH) !=  NET_MODE_REQUEST_HEAD_LENGTH)
   {
@@ -129,11 +148,32 @@
   }
 
   if(request_head.mod == REQ_REP) {
-    // TODO: shmModSocket.sendandrecv_unsafe
-    shmModSocket.sendandrecv(buf, request_head.content_length, request_head.key, &recv_buf, &recv_size);
-    response_head.content_length = recv_size;
-    Rio_writen(connfd, NetModSocket::encode_response_head(response_head), NET_MODE_RESPONSE_HEAD_LENGTH);
-    Rio_writen(connfd, recv_buf, recv_size);
+    if(shmModSocket.sendandrecv_unsafe(buf, request_head.content_length, request_head.key, &recv_buf, &recv_size) != 0) {
+      response_head.code = 1;
+      response_head.content_length = 0;
+      if( rio_writen(connfd, NetModSocket::encode_response_head(response_head), NET_MODE_RESPONSE_HEAD_LENGTH) != NET_MODE_RESPONSE_HEAD_LENGTH )
+        return -1;
+      //Rio_writen(connfd, recv_buf, recv_size);
+    } else {
+      response_head.code = 0;
+      response_head.content_length = recv_size;
+
+      response_buf_size = NET_MODE_RESPONSE_HEAD_LENGTH + recv_size;
+      if(max_response_buf < response_buf_size) {
+        buf = (char *)realloc(response_buf, response_buf_size);
+        max_response_buf = response_buf_size;
+      }
+      memcpy(response_buf, NetModSocket::encode_response_head(response_head),  NET_MODE_RESPONSE_HEAD_LENGTH);
+      memcpy(response_buf + NET_MODE_RESPONSE_HEAD_LENGTH, recv_buf,  recv_size);
+
+      if(rio_writen(connfd, response_buf, response_buf_size) != response_buf_size) {
+        return -1;
+      }
+      
+    }
+    return 0;
+    
+   
   } else if(request_head.mod == BUS) {
     if(request_head.topic_length > max_topic_buf) {
       topic_buf = realloc(topic_buf, request_head.topic_length);
@@ -147,7 +187,7 @@
     if (rio_readn(connfd, topic_buf, request_head.topic_length) != request_head.topic_length ) {
       return -1;
     }
- LoggerFactory::getLogger()->debug("====server pub %s===\n", buf);
+LoggerFactory::getLogger()->debug("====server pub %s===\n", buf);
     shmModSocket.pub((char*)topic_buf, request_head.topic_length, buf, request_head.content_length, request_head.key);
   }
 

--
Gitblit v1.8.0