From 546bdaa58724ec6a19b56e800ad60963bd3bd1bc Mon Sep 17 00:00:00 2001 From: wangzhengquan <wangzhengquan85@126.com> Date: 星期四, 04 二月 2021 11:42:24 +0800 Subject: [PATCH] modify callback function --- test_net_socket/CMakeLists.txt | 4 - src/socket/shm_mod_socket.h | 6 + src/net/net_mod_socket_wrapper.cpp | 42 ++++----- src/net/net_mod_socket_wrapper.h | 104 ++++++++++++++----------- src/net/net_mod_socket.h | 5 + test_net_socket/test_net_mod_socket.cpp | 12 +- src/socket/shm_socket.h | 14 ++- src/socket/shm_mod_socket.cpp | 11 -- src/net/net_mod_socket.cpp | 4 src/socket/shm_socket.cpp | 30 ++----- 10 files changed, 114 insertions(+), 118 deletions(-) diff --git a/src/net/net_mod_socket.cpp b/src/net/net_mod_socket.cpp index e1b30d7..06ba5c2 100644 --- a/src/net/net_mod_socket.cpp +++ b/src/net/net_mod_socket.cpp @@ -498,10 +498,10 @@ } -int NetModSocket::recvandsend(void **recvbuf, int *recvsize, int *key, recv_callback_fn callback, +int NetModSocket::recvandsend(recvandsend_callback_fn callback, const struct timespec *timeout , int flag, void * user_data ) { - return shmModSocket.recvandsend( recvbuf, recvsize, key, callback, timeout, flag, user_data); + return shmModSocket.recvandsend(callback, timeout, flag, user_data); } diff --git a/src/net/net_mod_socket.h b/src/net/net_mod_socket.h index 7d64bb1..a2acc55 100644 --- a/src/net/net_mod_socket.h +++ b/src/net/net_mod_socket.h @@ -195,7 +195,10 @@ - int recvandsend(void **recvbuf, int *recvsize, int *key, recv_callback_fn callback, + /** + * recvandsend + */ + int recvandsend( recvandsend_callback_fn callback, const struct timespec *timeout = NULL , int flag = 0, void * user_data = NULL ); /** diff --git a/src/net/net_mod_socket_wrapper.cpp b/src/net/net_mod_socket_wrapper.cpp index 72fd0d2..4be2d5c 100644 --- a/src/net/net_mod_socket_wrapper.cpp +++ b/src/net/net_mod_socket_wrapper.cpp @@ -90,34 +90,11 @@ return sockt->recvfrom_nowait(buf, size, key); } - -int net_mod_socket_recvandsend(void *_socket, void **recvbuf, int *recvsize, int *key, recv_callback_fn callback, void * user_data) { - NetModSocket *sockt = (NetModSocket *)_socket; - return sockt->recvandsend( recvbuf, recvsize, key, callback, NULL, 0, user_data); - -} - -int net_mod_socket_recvandsend_timeout(void *_socket, void **recvbuf, int *recvsize, int *key, recv_callback_fn callback, - int sec, int nsec, void * user_data) { - NetModSocket *sockt = (NetModSocket *)_socket; - struct timespec timeout = {sec, nsec}; - return sockt->recvandsend( recvbuf, recvsize, key, callback, &timeout, BUS_TIMEOUT_FLAG, user_data); -} - -int net_mod_socket_recvandsend_nowait(void *_socket, void **recvbuf, int *recvsize, int *key, recv_callback_fn callback, void * user_data) { - NetModSocket *sockt = (NetModSocket *)_socket; - return sockt->recvandsend( recvbuf, recvsize, key, callback, NULL, BUS_NOWAIT_FLAG, user_data); -} - - int net_mod_socket_sendandrecv(void *_socket, net_node_t *node_arr, int arrlen, void *send_buf, int send_size, net_mod_recv_msg_t ** recv_arr, int *recv_arr_size){ NetModSocket *sockt = (NetModSocket *)_socket; return sockt->sendandrecv(node_arr, arrlen, send_buf, send_size, recv_arr, recv_arr_size); } - - - /** * 濡傛灉寤虹珛杩炴帴鐨勮妭鐐规病鏈夋帴鍙楀埌娑堟伅绛夊緟timeout鐨勬椂闂村悗杩斿洖 @@ -137,6 +114,25 @@ } +int net_mod_socket_recvandsend(void *_socket, recvandsend_callback_fn callback, void * user_data) { + NetModSocket *sockt = (NetModSocket *)_socket; + return sockt->recvandsend( callback, NULL, 0, user_data); + +} + +int net_mod_socket_recvandsend_timeout(void *_socket, recvandsend_callback_fn callback, + int sec, int nsec, void * user_data) { + NetModSocket *sockt = (NetModSocket *)_socket; + struct timespec timeout = {sec, nsec}; + return sockt->recvandsend( callback, &timeout, BUS_TIMEOUT_FLAG, user_data); +} + +int net_mod_socket_recvandsend_nowait(void *_socket, recvandsend_callback_fn callback, void * user_data) { + NetModSocket *sockt = (NetModSocket *)_socket; + return sockt->recvandsend( callback, NULL, BUS_NOWAIT_FLAG, user_data); +} + + /** * 鍚憂ode_arr 涓殑鎵�鏈夌綉缁滆妭鐐瑰彂甯冩秷鎭� * @node_arr 缃戠粶鑺傜偣缁�, @node_arr_len璇ユ暟缁勯暱搴� diff --git a/src/net/net_mod_socket_wrapper.h b/src/net/net_mod_socket_wrapper.h index deacf4a..f7a15ea 100644 --- a/src/net/net_mod_socket_wrapper.h +++ b/src/net/net_mod_socket_wrapper.h @@ -122,51 +122,6 @@ -/** - * @brief 鎺ュ彈娑堟伅锛屽苟鎶奵allback鍑芥暟杩斿洖鐨勬暟鎹彂閫佸洖瀵规柟锛屼竴鐩寸瓑寰呭畬鎴� - * - * @param recvbuf 鎺ュ彈鍒扮殑娑堟伅瀛樻斁鐨勭紦瀛樺湴鍧�锛岃buf浣跨敤瀹屾垚鍚庨渶瑕佹墜鍔ㄩ噴鏀� - * @param recvsize 鎺ュ彈鍒版秷鎭殑闀垮害 - * @param key 浠庤皝鍝噷鏀跺埌鐨勪俊鎭� - * @callback void (*recv_callback_fn)(void **sendbuf, int *sendsize, void * user_data) - * sendbuf 鍜� sendsize鏄痗allbak_fn鍥炶皟鍑芥暟鐨勮繑鍥炲��, 鍒嗗埆琛ㄧず杩斿洖鐨勬暟鎹紝鍜岃繑鍥炴暟鎹殑闀垮害銆� - * - * @return 0鏄垚鍔燂紝 鍏朵粬鍊兼槸澶辫触鐨勯敊璇爜 - */ -int net_mod_socket_recvandsend(void *_socket, void **recvbuf, int *recvsize, int *key, recv_callback_fn callback, void * user_data); - -/** - * @brief 鎺ュ彈娑堟伅锛屽苟鎶奵allback鍑芥暟杩斿洖鐨勬暟鎹彂閫佸洖瀵规柟锛屽湪鎸囧畾鐨勬椂闂村唴鍗充娇娌℃湁瀹屾垚涔熻繑鍥� - * - * @param recvbuf 鎺ュ彈鍒扮殑娑堟伅瀛樻斁鐨勭紦瀛樺湴鍧�锛岃buf浣跨敤瀹屾垚鍚庨渶瑕佹墜鍔ㄩ噴鏀� - * @param recvsize 鎺ュ彈鍒版秷鎭殑闀垮害 - * @param key 浠庤皝鍝噷鏀跺埌鐨勪俊鎭� - * @callback void (*recv_callback_fn)(void **sendbuf, int *sendsize, void * user_data) - * sendbuf 鍜� sendsize鏄痗allbak_fn鍥炶皟鍑芥暟鐨勮繑鍥炲��, 鍒嗗埆琛ㄧず杩斿洖鐨勬暟鎹紝鍜岃繑鍥炴暟鎹殑闀垮害銆� - * - * @param sec 绉� - * @param nsec 绾崇 - * - * @return 0鏄垚鍔燂紝 鍏朵粬鍊兼槸澶辫触鐨勯敊璇爜 - */ -int net_mod_socket_recvandsend_timeout(void *_socket, void **recvbuf, int *recvsize, int *key, recv_callback_fn callback, - int sec, int nsec, void * user_data ) ; - - -/** - * @brief 鎺ュ彈娑堟伅锛屽苟鎶奵allback鍑芥暟杩斿洖鐨勬暟鎹彂閫佸洖瀵规柟锛屾棤璁烘垚鍔熶笌鍚︾珛鍒昏繑鍥� - * - * @param recvbuf 鎺ュ彈鍒扮殑娑堟伅瀛樻斁鐨勭紦瀛樺湴鍧�锛岃buf浣跨敤瀹屾垚鍚庨渶瑕佹墜鍔ㄩ噴鏀� - * @param recvsize 鎺ュ彈鍒版秷鎭殑闀垮害 - * @param key 浠庤皝鍝噷鏀跺埌鐨勪俊鎭� - * @callback void (*recv_callback_fn)(void **sendbuf, int *sendsize, void * user_data) - * sendbuf 鍜� sendsize鏄痗allbak_fn鍥炶皟鍑芥暟鐨勮繑鍥炲��, 鍒嗗埆琛ㄧず杩斿洖鐨勬暟鎹紝鍜岃繑鍥炴暟鎹殑闀垮害銆� - * - * @return 0鏄垚鍔燂紝 鍏朵粬鍊兼槸澶辫触鐨勯敊璇爜 - */ -int net_mod_socket_recvandsend_nowait(void *_socket, void **recvbuf, int *recvsize, int *key, recv_callback_fn callback, void * user_data) ; - - /** * @brief 璺ㄦ満鍣ㄥ彂閫佹秷鎭苟鎺ュ彈杩斿洖鐨勫簲绛旀秷鎭紝鐩村埌鍙戦�佸畬鎴愭墠杩斿洖 @@ -205,6 +160,65 @@ net_mod_recv_msg_t ** recv_arr, int *recv_arr_size, int timeout); + + +/** + * @brief 鎺ュ彈娑堟伅锛屽苟鎶奵allback鍑芥暟杩斿洖鐨勬暟鎹彂閫佸洖瀵规柟锛屼竴鐩寸瓑寰呭畬鎴� + * + * @param recvbuf 鎺ュ彈鍒扮殑娑堟伅瀛樻斁鐨勭紦瀛樺湴鍧�锛岃buf浣跨敤瀹屾垚鍚庨渶瑕佹墜鍔ㄩ噴鏀� + * @param recvsize 鎺ュ彈鍒版秷鎭殑闀垮害 + * @param key 浠庤皝鍝噷鏀跺埌鐨勪俊鎭� + * @callback void (*recvandsend_callback_fn)(void *recvbuf, int recvsize, int key, void **sendbuf, int *sendsize, void * user_data) + * @recvbuf 鏀跺埌鐨勬暟鎹� + * @recvsize 鏀跺埌鐨勬暟鎹殑澶у皬 + * @key 鎺ュ彈鏁版嵁骞跺苟鍙戦�佹暟鎹殑瀵硅薄 + * @sendbuf 瀛樺偍杩斿洖鍊肩殑鍦板潃锛岃〃绀鸿繑鍥炵殑鏁版嵁 + * @sendsize 瀛樺偍杩斿洖鍊肩殑鍦板潃锛� 杩斿洖鏁版嵁鐨勯暱搴� + * + * @return 0鏄垚鍔燂紝 鍏朵粬鍊兼槸澶辫触鐨勯敊璇爜 + */ +int net_mod_socket_recvandsend(void *_socket, recvandsend_callback_fn callback, void * user_data); + +/** + * @brief 鎺ュ彈娑堟伅锛屽苟鎶奵allback鍑芥暟杩斿洖鐨勬暟鎹彂閫佸洖瀵规柟锛屽湪鎸囧畾鐨勬椂闂村唴鍗充娇娌℃湁瀹屾垚涔熻繑鍥� + * + * @param recvbuf 鎺ュ彈鍒扮殑娑堟伅瀛樻斁鐨勭紦瀛樺湴鍧�锛岃buf浣跨敤瀹屾垚鍚庨渶瑕佹墜鍔ㄩ噴鏀� + * @param recvsize 鎺ュ彈鍒版秷鎭殑闀垮害 + * @param key 浠庤皝鍝噷鏀跺埌鐨勪俊鎭� + * @callback void (*recvandsend_callback_fn)(void *recvbuf, int recvsize, int key, void **sendbuf, int *sendsize, void * user_data) + * @recvbuf 鏀跺埌鐨勬暟鎹� + * @recvsize 鏀跺埌鐨勬暟鎹殑澶у皬 + * @key 鎺ュ彈鏁版嵁骞跺苟鍙戦�佹暟鎹殑瀵硅薄 + * @sendbuf 瀛樺偍杩斿洖鍊肩殑鍦板潃锛岃〃绀鸿繑鍥炵殑鏁版嵁 + * @sendsize 瀛樺偍杩斿洖鍊肩殑鍦板潃锛� 杩斿洖鏁版嵁鐨勯暱搴� + * + * @param sec 绉� + * @param nsec 绾崇 + * + * @return 0鏄垚鍔燂紝 鍏朵粬鍊兼槸澶辫触鐨勯敊璇爜 + */ +int net_mod_socket_recvandsend_timeout(void *_socket, recvandsend_callback_fn callback, + int sec, int nsec, void * user_data ) ; + + +/** + * @brief 鎺ュ彈娑堟伅锛屽苟鎶奵allback鍑芥暟杩斿洖鐨勬暟鎹彂閫佸洖瀵规柟锛屾棤璁烘垚鍔熶笌鍚︾珛鍒昏繑鍥� + * + * @param recvbuf 鎺ュ彈鍒扮殑娑堟伅瀛樻斁鐨勭紦瀛樺湴鍧�锛岃buf浣跨敤瀹屾垚鍚庨渶瑕佹墜鍔ㄩ噴鏀� + * @param recvsize 鎺ュ彈鍒版秷鎭殑闀垮害 + * @param key 浠庤皝鍝噷鏀跺埌鐨勪俊鎭� + * @callback void (*recvandsend_callback_fn)(void *recvbuf, int recvsize, int key, void **sendbuf, int *sendsize, void * user_data) + * @recvbuf 鏀跺埌鐨勬暟鎹� + * @recvsize 鏀跺埌鐨勬暟鎹殑澶у皬 + * @key 鎺ュ彈鏁版嵁骞跺苟鍙戦�佹暟鎹殑瀵硅薄 + * @sendbuf 瀛樺偍杩斿洖鍊肩殑鍦板潃锛岃〃绀鸿繑鍥炵殑鏁版嵁 + * @sendsize 瀛樺偍杩斿洖鍊肩殑鍦板潃锛� 杩斿洖鏁版嵁鐨勯暱搴� + * + * @return 0鏄垚鍔燂紝 鍏朵粬鍊兼槸澶辫触鐨勯敊璇爜 + */ +int net_mod_socket_recvandsend_nowait(void *_socket, recvandsend_callback_fn callback, void * user_data) ; + + /** * @brief 璺ㄦ満鍣ㄥ彂閫佹秷鎭苟鎺ュ彈杩斿洖鐨勫簲绛旀秷鎭紝涓嶇鏄惁鍙戦�佸畬鎴愮珛鍒昏繑鍥� * diff --git a/src/socket/shm_mod_socket.cpp b/src/socket/shm_mod_socket.cpp index 32ff061..f5bd0b7 100644 --- a/src/socket/shm_mod_socket.cpp +++ b/src/socket/shm_mod_socket.cpp @@ -91,16 +91,9 @@ } -int ShmModSocket::recvandsend(void **recvbuf, int *recvsize, int *key, recv_callback_fn callback, +int ShmModSocket::recvandsend( recvandsend_callback_fn callback, const struct timespec *timeout , int flag, void * user_data ) { - int rv = shm_recvandsend(shm_socket, recvbuf, recvsize, key, callback, timeout, flag, user_data); - if(rv == 0) { - logger->debug("ShmModSocket::shm_recvandsend: success. key = %d\n", *key); - return 0; - } - - logger->debug("ShmModSocket::shm_recvandsend : failed. %s", bus_strerror(rv)); - return rv; + return shm_recvandsend(shm_socket, callback, timeout, flag, user_data); } // // 瓒呮椂杩斿洖銆� @sec 绉� 锛� @nsec 绾崇 diff --git a/src/socket/shm_mod_socket.h b/src/socket/shm_mod_socket.h index c0bd3d4..fb389a3 100644 --- a/src/socket/shm_mod_socket.h +++ b/src/socket/shm_mod_socket.h @@ -87,8 +87,10 @@ const struct timespec *timeout = NULL, int flag = 0); - int recvandsend(void **recvbuf, int *recvsize, int *key, recv_callback_fn callback, - const struct timespec *timeout = NULL , int flag = 0, void * user_data = NULL); + /** + * + */ + int recvandsend( recvandsend_callback_fn callback, const struct timespec *timeout = NULL , int flag = 0, void * user_data = NULL); /** * 璁㈤槄鎸囧畾涓婚 diff --git a/src/socket/shm_socket.cpp b/src/socket/shm_socket.cpp index fbb849d..9ce94da 100644 --- a/src/socket/shm_socket.cpp +++ b/src/socket/shm_socket.cpp @@ -242,11 +242,11 @@ } /** - * @callback void (*recv_callback_fn)(void **sendbuf, int *sendsize) + * @callback void (*recvandsend_callback_fn)(void *recvbuf, int recvsize, int key, void **sendbuf, int *sendsize) * sendbuf 鍜� sendsize鏄痗allbak_fn鍥炶皟鍑芥暟鐨勮繑鍥炲��, 鍒嗗埆琛ㄧず鍙戦�佹暟鎹紝鍜屽彂閫佹暟鎹殑澶у皬銆� * */ -int shm_recvandsend(shm_socket_t *sockt, void **recvbuf, int *recvsize, int *key, recv_callback_fn callback, +int shm_recvandsend(shm_socket_t *sockt, recvandsend_callback_fn callback, const struct timespec *timeout, int flag, void *user_data) { int rv; @@ -257,31 +257,21 @@ rv = shm_recvpakfrom(sockt , &recvpak, timeout, flag); - - if (rv != 0) { - if(rv == ETIMEDOUT) + if(rv == ETIMEDOUT){ + logger->debug("%d shm_recvfrom failed %s", shm_socket_get_key(sockt), bus_strerror(EBUS_TIMEOUT)); return EBUS_TIMEOUT; + } - logger->debug("%d shm_recvfrom failed %s", shm_socket_get_key(sockt), bus_strerror(rv)); + logger->error("%d shm_recvfrom failed %s", shm_socket_get_key(sockt), bus_strerror(rv)); return rv; } - if(recvbuf != NULL) { - void *_buf = malloc(recvpak.size); - memcpy(_buf, recvpak.buf, recvpak.size); - *recvbuf = _buf; - } - - if(recvsize != NULL) - *recvsize = recvpak.size; - - if(key != NULL) - *key = recvpak.key; - + + void *recvbuf = malloc(recvpak.size); + memcpy(recvbuf, recvpak.buf, recvpak.size); mm_free(recvpak.buf); - - callback(&sendbuf, &sendsize, user_data); + callback(recvbuf, recvpak.size, recvpak.key, &sendbuf, &sendsize, user_data); shm_packet_t sendpak; sendpak.key = sockt->key; diff --git a/src/socket/shm_socket.h b/src/socket/shm_socket.h index aa5fc90..6444913 100644 --- a/src/socket/shm_socket.h +++ b/src/socket/shm_socket.h @@ -41,8 +41,8 @@ } shm_socket_t; -// typedef void (*recv_callback_fn)(void **sendbuf, int *sendsize); -typedef std::function<void(void **sendbuf, int *sendsize, void *user_data)> recv_callback_fn; +// typedef void (*recvandsend_callback_fn)(void **sendbuf, int *sendsize); +typedef std::function<void(void *recvbuf, int recvsize, int key, void **sendbuf, int *sendsize, void *user_data)> recvandsend_callback_fn; size_t shm_socket_remove_keys(int keys[], size_t length); @@ -67,11 +67,15 @@ const struct timespec * timeout = NULL, int flags = 0); /** - * @callback void (*recv_callback_fn)(void **sendbuf, int *sendsize) - * sendbuf 鍜� sendsize鏄痗allbak_fn鍥炶皟鍑芥暟鐨勮繑鍥炲��, 鍒嗗埆琛ㄧず鍙戦�佹暟鎹紝鍜屽彂閫佹暟鎹殑澶у皬銆� + * @callback void (*recvandsend_callback_fn)(void *recvbuf, int recvsize, int key, void **sendbuf, int *sendsize, void * user_data) + * @recvbuf 鏀跺埌鐨勬暟鎹� + * @recvsize 鏀跺埌鐨勬暟鎹殑澶у皬 + * @key 鎺ュ彈鏁版嵁骞跺苟鍙戦�佹暟鎹殑瀵硅薄 + * @sendbuf 瀛樺偍杩斿洖鍊肩殑鍦板潃锛岃〃绀鸿繑鍥炵殑鏁版嵁 + * @sendsize 瀛樺偍杩斿洖鍊肩殑鍦板潃锛� 杩斿洖鏁版嵁鐨勯暱搴� * */ -int shm_recvandsend(shm_socket_t *sockt, void **recvbuf, int *recvsize, int *key, recv_callback_fn callback, +int shm_recvandsend(shm_socket_t *sockt, recvandsend_callback_fn callback, const struct timespec *timeout = NULL, int flag = 0, void * user_data = NULL); diff --git a/test_net_socket/CMakeLists.txt b/test_net_socket/CMakeLists.txt index 54e13e9..d11a1c9 100644 --- a/test_net_socket/CMakeLists.txt +++ b/test_net_socket/CMakeLists.txt @@ -24,10 +24,6 @@ ) -add_executable(test_recvandsend test_recvandsend.cpp) -target_link_libraries(test_recvandsend PRIVATE shm_queue ${EXTRA_LIBS} ) - - target_include_directories(test_net_mod_socket PRIVATE "${PROJECT_BINARY_DIR}" ${EXTRA_INCLUDES} diff --git a/test_net_socket/test_net_mod_socket.cpp b/test_net_socket/test_net_mod_socket.cpp index bdbcc9b..8711bca 100644 --- a/test_net_socket/test_net_mod_socket.cpp +++ b/test_net_socket/test_net_mod_socket.cpp @@ -137,18 +137,16 @@ printf("start reply\n"); void *ser = net_mod_socket_open(); net_mod_socket_bind(ser, mkey); - int recvsize; - void *recvbuf; char sendbuf[512]; int rv; - int key; while(true) { - rv = net_mod_socket_recvandsend_timeout(ser, &recvbuf, &recvsize, &key, [&](void ** buf, int *size, void * user_data){ - printf( "server: RECEIVED REQUEST FROM %d : %s\n", key, recvbuf); + rv = net_mod_socket_recvandsend_timeout(ser, [&]( void *recvbuf, int recvsize, int key, void ** sendbuf_ptr, int *sendsize_ptr, void * user_data){ + printf( "server: RECEIVED REQUEST FROM %d : %s\n", key, (char *)recvbuf); sprintf(sendbuf, "%d RECEIVED %s", net_mod_socket_get_key(ser), (char *)recvbuf); // buf 鍜� size鏄繑鍥炲�� - *buf = sendbuf; - *size = strlen(sendbuf) + 1; + *sendbuf_ptr = sendbuf; + *sendsize_ptr = strlen(sendbuf) + 1; + //recvbuf鏄垎閰嶅埌鍫嗛噷鐨勶紝浣跨敤瀹屽悗涓嶈蹇樿閲婃斁鎺� free(recvbuf); return; }, 0, 2000000, NULL ); -- Gitblit v1.8.0