From 34ddc11240baa01d15b24f09e39d09cb4dd15c75 Mon Sep 17 00:00:00 2001
From: wangzhengquan <wangzhengquan85@126.com>
Date: 星期二, 13 十月 2020 10:41:20 +0800
Subject: [PATCH] update
---
src/socket/net_mod_socket.c | 43 +++++++++++++++++++--
test_net_socket/net_mod_req_rep.sh | 8 ++--
src/libshm_queue.a | 0
src/socket/net_mod_server_socket.h | 3 +
src/socket/net_mod_socket.h | 15 +++++++
src/socket/net_mod_server_socket.c | 18 ++++++--
6 files changed, 72 insertions(+), 15 deletions(-)
diff --git a/src/libshm_queue.a b/src/libshm_queue.a
index 0f6ae25..c9f1c38 100644
--- a/src/libshm_queue.a
+++ b/src/libshm_queue.a
Binary files differ
diff --git a/src/socket/net_mod_server_socket.c b/src/socket/net_mod_server_socket.c
index 91586c2..1cd3838 100644
--- a/src/socket/net_mod_server_socket.c
+++ b/src/socket/net_mod_server_socket.c
@@ -4,7 +4,7 @@
#include "net_mod_socket_io.h"
#include "net_mod_socket.h"
-NetModServerSocket::NetModServerSocket(int port)
+NetModServerSocket::NetModServerSocket(int port):max_buf(1024)
{
char portstr[32];
@@ -12,11 +12,17 @@
sprintf(portstr, "%d", port);
listenfd = Open_listenfd(portstr);
init_pool(listenfd);
+
+ buf = malloc(max_buf);
+ if(buf == NULL) {
+ err_exit(errno, "process_client malloc");
+ }
}
NetModServerSocket::~NetModServerSocket() {
Close(listenfd);
+ fee(buf);
}
void NetModServerSocket::start() {
@@ -88,11 +94,11 @@
int n;
net_mod_request_head_t request_head;
net_mod_response_head_t response_head;
+ char request_head_bs[NET_MODE_REQUEST_HEAD_LENGTH];
void *recv_buf;
- static void *buf = NULL;
+
int recv_size;
- static size_t max_buf = 1024;
if(buf == NULL) {
buf = malloc(max_buf);
if(buf == NULL) {
@@ -101,10 +107,12 @@
}
- if ((n = rio_readnb(rio, &request_head, sizeof(net_mod_request_head_t))) != sizeof(net_mod_request_head_t))
+ if (rio_readnb(rio, request_head_bs, NET_MODE_REQUEST_HEAD_LENGTH) != NET_MODE_REQUEST_HEAD_LENGTH)
{
return -1;
}
+
+ request_head = NetModSocket::decode_request_head(request_head_bs);
if(request_head.content_length > max_buf) {
buf = realloc(buf, request_head.content_length);
@@ -121,7 +129,7 @@
if(request_head.mod == REQ_REP) {
shmModSocket.sendandrecv(buf, request_head.content_length, request_head.key, &recv_buf, &recv_size);
response_head.content_length = recv_size;
- Rio_writen(connfd, &response_head, sizeof(response_head));
+ Rio_writen(connfd, NetModSocket::encode_response_head(response_head), NET_MODE_RESPONSE_HEAD_LENGTH);
Rio_writen(connfd, recv_buf, recv_size);
}
diff --git a/src/socket/net_mod_server_socket.h b/src/socket/net_mod_server_socket.h
index c79837b..13e43f7 100644
--- a/src/socket/net_mod_server_socket.h
+++ b/src/socket/net_mod_server_socket.h
@@ -31,6 +31,9 @@
ShmModSocket shmModSocket;
pool pool;
+ void *buf = NULL;
+ size_t max_buf;
+
void init_pool(int listenfd);
void add_client(int connfd);
void check_clients();
diff --git a/src/socket/net_mod_socket.c b/src/socket/net_mod_socket.c
index 9152697..bb50c59 100644
--- a/src/socket/net_mod_socket.c
+++ b/src/socket/net_mod_socket.c
@@ -11,6 +11,10 @@
}
+NetModSocket::~NetModSocket() {
+
+}
+
int NetModSocket::sendandrecv(net_node_t *node_arr, int arrlen, void *send_buf, int send_size,
net_mod_recv_msg_t ** recv_arr, int *recv_arr_size) {
@@ -20,6 +24,7 @@
char mapKey[256];
void *recv_buf;
int recv_size;
+ char response_head_bs[NET_MODE_RESPONSE_HEAD_LENGTH];
net_mod_request_head_t request_head;
net_mod_response_head_t response_head;
std::map<std::string, rio_t*>::iterator mapIter;
@@ -49,18 +54,21 @@
request_head.mod = REQ_REP;
request_head.key = node->key;
request_head.content_length = send_size;
- if( (n = rio_writen(rio->rio_fd, &request_head, sizeof(request_head))) != sizeof(request_head)) {
+ if(rio_writen(rio->rio_fd, NetModSocket::encode_request_head(request_head), NET_MODE_REQUEST_HEAD_LENGTH) != NET_MODE_REQUEST_HEAD_LENGTH) {
err_exit(errno, "NetModSocket::send head rio_writen");
}
- if( (n = rio_writen(rio->rio_fd, send_buf, send_size)) != send_size ) {
+ if(rio_writen(rio->rio_fd, send_buf, send_size) != send_size ) {
err_exit(errno, "NetModSocket::send conent rio_writen");
}
- if ((n = rio_readnb(rio, &response_head, sizeof(response_head))) != sizeof(response_head)) {
+
+ if ( rio_readnb(rio, response_head_bs, NET_MODE_RESPONSE_HEAD_LENGTH) != NET_MODE_RESPONSE_HEAD_LENGTH) {
err_exit(errno, "NetModSocket::send rio_readnb");
}
+
+ response_head = NetModSocket::decode_response_head(response_head_bs);
recv_buf = malloc(response_head.content_length);
if(recv_buf == NULL) {
@@ -99,7 +107,32 @@
// }
-NetModSocket::~NetModSocket() {
-
+void * NetModSocket::encode_request_head(net_mod_request_head_t & request) {
+ char * head = (char *)malloc(NET_MODE_REQUEST_HEAD_LENGTH);
+ PUT(head, htonl(request.mod));
+ PUT(head + 4, htonl(request.key));
+ PUT(head + 8, htonl(request.content_length));
+ return head;
}
+net_mod_request_head_t NetModSocket::decode_request_head(void *_headbs) {
+ char *headbs = (char *)_headbs;
+ net_mod_request_head_t head;
+ head.mod = ntohl(GET(headbs));
+ head.key = ntohl(GET(headbs + 4));
+ head.content_length = ntohl(GET(headbs + 8));
+ return head;
+}
+
+void * NetModSocket::encode_response_head(net_mod_response_head_t & response) {
+ char * head = (char *)malloc(NET_MODE_RESPONSE_HEAD_LENGTH);
+ PUT(head, htonl(response.content_length));
+ return head;
+}
+
+net_mod_response_head_t NetModSocket::decode_response_head(void *_headbs) {
+ char *headbs = (char *)_headbs;
+ net_mod_response_head_t head;
+ head.content_length = ntohl(GET(headbs));
+ return head;
+}
diff --git a/src/socket/net_mod_socket.h b/src/socket/net_mod_socket.h
index 93b3ad3..a155c29 100644
--- a/src/socket/net_mod_socket.h
+++ b/src/socket/net_mod_socket.h
@@ -4,6 +4,12 @@
#include "shm_mod_socket.h"
#include "socket_io.h"
+#define GET(p) (*(uint32_t *)(p))
+#define PUT(p, val) (*(uint32_t *)(p) = (val))
+
+#define NET_MODE_REQUEST_HEAD_LENGTH 12
+#define NET_MODE_RESPONSE_HEAD_LENGTH 4
+
struct net_node_t
{
const char *host;
@@ -48,9 +54,16 @@
~NetModSocket();
- static void free_recv_msg_arr(net_mod_recv_msg_t * arr, size_t size);
+ static void free_recv_msg_arr(net_mod_recv_msg_t * arr, size_t size);
+
+ static void * encode_request_head(net_mod_request_head_t & request);
+ static net_mod_request_head_t decode_request_head(void *headbs);
+
+ static void * encode_response_head(net_mod_response_head_t & response);
+ static net_mod_response_head_t decode_response_head(void *_headbs);
};
+
#endif
\ No newline at end of file
diff --git a/test_net_socket/net_mod_req_rep.sh b/test_net_socket/net_mod_req_rep.sh
index 7661f88..94f79f4 100755
--- a/test_net_socket/net_mod_req_rep.sh
+++ b/test_net_socket/net_mod_req_rep.sh
@@ -13,7 +13,7 @@
./net_mod_req_rep client 5000
}
-function clean() {
+function close() {
ps -ef | grep -e "dgram_mod_req_rep" -e "net_mod_req_rep" | awk '{print $2}' | xargs -i kill -9 {}
ipcrm -a
}
@@ -25,11 +25,11 @@
"client")
client
;;
- "clean")
- clean
+ "close")
+ close
;;
"")
- clean
+ close
server
client
;;
--
Gitblit v1.8.0