From 3a89a77e79407d0d638ddf983ee580410cf807c5 Mon Sep 17 00:00:00 2001
From: wangzhengquan <wangzhengquan85@126.com>
Date: 星期二, 04 八月 2020 15:56:12 +0800
Subject: [PATCH] fix sendto
---
src/socket/include/shm_socket.h | 7 ++
test_socket/test_survey.sh | 52 +++++++++++++++++
src/socket/shm_socket.c | 12 ++-
src/util/sem_util.c | 4
test_socket/dgram_mod_survey.c | 81 +++++++++++++++++++++++++-
test_socket/dgram_mod_req_rep.c | 2
6 files changed, 145 insertions(+), 13 deletions(-)
diff --git a/src/socket/include/shm_socket.h b/src/socket/include/shm_socket.h
index 4852b27..dd93f75 100644
--- a/src/socket/include/shm_socket.h
+++ b/src/socket/include/shm_socket.h
@@ -29,6 +29,11 @@
};
+enum shm_socket_error_type_t {
+ SHM_SOCKET_CONN_FAILED = 1,
+ SHM_SOCKET_TIMEOUT = 2
+};
+
enum shm_connection_status_t {
SHM_CONN_CLOSED=1,
SHM_CONN_LISTEN=2,
@@ -44,6 +49,8 @@
} shm_msg_t;
+
+
typedef struct shm_socket_t {
shm_socket_type_t socket_type;
// 鏈湴port
diff --git a/src/socket/shm_socket.c b/src/socket/shm_socket.c
index f95379a..c6d9dcb 100644
--- a/src/socket/shm_socket.c
+++ b/src/socket/shm_socket.c
@@ -267,6 +267,12 @@
return -1;
}
+ SHMQueue<shm_msg_t> *remoteQueue;
+ if ((remoteQueue = _attach_remote_queue(port)) == NULL) {
+ err_msg(0, "shm_sendto failed, the other end has been closed, or has not been opened!");
+ return SHM_SOCKET_CONN_FAILED;
+ }
+
shm_msg_t dest;
dest.type = SHM_COMMON_MSG;
dest.port = socket->port;
@@ -274,11 +280,6 @@
dest.buf = mm_malloc(size);
memcpy(dest.buf, buf, size);
- SHMQueue<shm_msg_t> *remoteQueue;
- if ((remoteQueue = _attach_remote_queue(port)) == NULL) {
- err_msg(0, "shm_sendto failed, the other end has been closed, or has not been opened!");
- return -1;
- }
// printf("shm_sendto push before\n");
bool rv;
if(flags & SHM_MSG_NOWAIT != 0) {
@@ -295,6 +296,7 @@
return 0;
} else {
delete remoteQueue;
+ mm_free(dest.buf);
err_msg(errno, "sendto port %d failed!", port);
return -1;
}
diff --git a/src/util/sem_util.c b/src/util/sem_util.c
index c73d1e1..bf08adf 100644
--- a/src/util/sem_util.c
+++ b/src/util/sem_util.c
@@ -81,7 +81,7 @@
while (semop(semId, &sops, 1) == -1)
if (errno != EINTR) {
- // err_msg(errno, "SemUtil::dec");
+ err_msg(errno, "SemUtil::dec");
return -1;
}
@@ -97,7 +97,7 @@
while (semop(semId, &sops, 1) == -1)
if (errno != EINTR) {
- // err_msg(errno, "SemUtil::dec_nowait");
+ err_msg(errno, "SemUtil::dec_nowait");
return -1;
}
diff --git a/test_socket/dgram_mod_req_rep.c b/test_socket/dgram_mod_req_rep.c
index bac0aa6..4ec451f 100644
--- a/test_socket/dgram_mod_req_rep.c
+++ b/test_socket/dgram_mod_req_rep.c
@@ -152,7 +152,7 @@
}
if (strcmp("client", argv[1]) == 0)
- startClients(port);
+ client(port);
return 0;
diff --git a/test_socket/dgram_mod_survey.c b/test_socket/dgram_mod_survey.c
index 24a72a5..a492637 100644
--- a/test_socket/dgram_mod_survey.c
+++ b/test_socket/dgram_mod_survey.c
@@ -2,6 +2,20 @@
#include "shm_mm.h"
#include "usg_common.h"
+
+typedef struct Targ {
+ int port;
+ int id;
+
+}Targ;
+
+void sigint_handler(int sig) {
+ //dgram_mod_close_socket(server_socket);
+ printf("===Catch sigint======================\n");
+ shm_destroy();
+ exit(0);
+}
+
void server(int port) {
void *socket = dgram_mod_open_socket();
dgram_mod_bind(socket, port);
@@ -10,9 +24,12 @@
char sendbuf[512];
int rv;
int remote_port;
- while ( (rv = dgram_mod_recvfrom(socket, &recvbuf, &size, &remote_port) ) == 0) {
- printf( "RECEIVED HREARTBEAT FROM %d: %s\n", remote_port, recvbuf);
- free(recvbuf);
+ while (true) {
+ if ((rv = dgram_mod_recvfrom_timeout(socket, &recvbuf, &size, &remote_port, 5, 0) ) == 0) {
+ printf( "RECEIVED HREARTBEAT FROM %d: %s\n", remote_port, recvbuf);
+ free(recvbuf);
+ }
+
}
dgram_mod_close_socket(socket);
}
@@ -26,13 +43,67 @@
sprintf(sendbuf, "%d", i);
printf("SEND HEART:%s\n", sendbuf);
dgram_mod_sendto(socket, sendbuf, strlen(sendbuf) + 1, port);
- sleep(1);
+ // sleep(1);
i++;
}
dgram_mod_close_socket(socket);
}
+
+void *runclient(void *arg) {
+ signal(SIGINT, sigint_handler);
+ Targ *targ = (Targ *)arg;
+ int port = targ->port;
+ void *socket = dgram_mod_open_socket();
+ int size;
+ char sendbuf[512];
+ long scale = 10;
+ long i = 0;
+ while (i < scale) {
+ sprintf(sendbuf, "%d", i);
+ printf("%d SEND HEART:%s\n", targ->id, sendbuf);
+ dgram_mod_sendto(socket, sendbuf, strlen(sendbuf) + 1, port);
+ // sleep(1);
+ i++;
+ }
+
+ dgram_mod_close_socket(socket);
+ return (void *)i;
+}
+
+void startClients(int port) {
+
+ int status, i = 0, processors = 100;
+ void *res[processors];
+ Targ *targs = (Targ *)calloc(processors, sizeof(Targ));
+ pthread_t tids[processors];
+ char sendbuf[512];
+
+ struct timeval start;
+ gettimeofday(&start, NULL);
+ for (i = 0; i < processors; i++) {
+ targs[i].port = port;
+ targs[i].id = i;
+ pthread_create(&tids[i], NULL, runclient, (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]);
+ }
+ }
+
+ struct timeval end;
+ gettimeofday(&end, NULL);
+
+ double difftime = end.tv_sec * 1000000 + end.tv_usec - (start.tv_sec * 1000000 + start.tv_usec);
+ long diffsec = (long) (difftime/1000000);
+ long diffmsec = difftime - diffsec*1000000;
+ printf("cost: %ld sec: %ld msc\n", diffsec, diffmsec);
+}
int main(int argc, char *argv[]) {
shm_init(512);
@@ -51,6 +122,6 @@
if (strcmp("client", argv[1]) == 0)
client(port);
-
+ shm_destroy();
return 0;
}
\ No newline at end of file
diff --git a/test_socket/test_survey.sh b/test_socket/test_survey.sh
new file mode 100755
index 0000000..bd803e6
--- /dev/null
+++ b/test_socket/test_survey.sh
@@ -0,0 +1,52 @@
+PROCESSES=100
+function clean() {
+ ps -ef | grep "dgram_mod_survey" | awk '{print $2}' | xargs -i kill -9 {}
+ ipcrm -a
+}
+
+function start_server() {
+ clean
+ ./dgram_mod_survey server 8 & server_pid=$!
+ echo "start server pid ${server_pid}"
+}
+
+function start_clients() {
+ for (( i=0; i<$PROCESSES; i++ ))
+ do
+ # pid_arr[$i]=$i
+ ./dgram_mod_survey client 8 & pid_arr[$i]=$!
+ echo "start ${pid_arr[$i]}"
+ done
+}
+
+function close_cleints() {
+ for (( i=0; i<$PROCESSES; i++ ))
+ do
+ echo "kill ${pid_arr[$i]}"
+ kill -9 ${pid_arr[$i]}
+ #./dgram_mod_survey client 8 & ${pid_arr[$i]}=$!
+ done
+}
+
+
+case ${1} in
+ "server")
+ start_server
+ ;;
+ "clients")
+ start_clients
+ sleep 5
+ close_cleints
+ ;;
+ "")
+ start_server
+ sleep 1
+ start_clients
+ sleep 5
+ close_cleints
+ ;;
+ *)
+ echo "error input"
+ exit 1
+ ;;
+esac
--
Gitblit v1.8.0