| | |
| | | } |
| | | |
| | | |
| | | int NetModSocket::recvandsend(void **recvbuf, int *recvsize, int *key, recv_callback_fn callback, |
| | | const struct timespec *timeout , int flag, void * user_data ) { |
| | | |
| | | int NetModSocket::recvandsend(void **recvbuf, int *recvsize, int *key, recv_callback_fn callback) { |
| | | return shmModSocket.recvandsend( recvbuf, recvsize, key, callback); |
| | | |
| | | return shmModSocket.recvandsend( recvbuf, recvsize, key, callback, timeout, flag, user_data); |
| | | } |
| | | |
| | | int NetModSocket::recvandsend_timeout(void **recvbuf, int *recvsize, int *key, recv_callback_fn callback, |
| | | const struct timespec *timeout ) { |
| | | return shmModSocket.recvandsend( recvbuf, recvsize, key, callback, timeout, BUS_TIMEOUT_FLAG); |
| | | |
| | | } |
| | | |
| | | int NetModSocket::recvandsend_nowait(void **recvbuf, int *recvsize, int *key, recv_callback_fn callback) { |
| | | return shmModSocket.recvandsend( recvbuf, recvsize, key, callback, NULL, BUS_NOWAIT_FLAG); |
| | | |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 发送请求信息并等待接收应答 |
| | |
| | | int sendandrecv_nowait( const void *send_buf, const int send_size, const int send_key, void **recv_buf, int *recv_size) ; |
| | | |
| | | |
| | | int recvandsend(void **recvbuf, int *recvsize, int *key, recv_callback_fn callback) ; |
| | | |
| | | |
| | | int recvandsend_timeout(void **recvbuf, int *recvsize, int *key, recv_callback_fn callback, |
| | | const struct timespec *timeout ); |
| | | int recvandsend_nowait(void **recvbuf, int *recvsize, int *key, recv_callback_fn callback); |
| | | int recvandsend(void **recvbuf, int *recvsize, int *key, recv_callback_fn callback, |
| | | const struct timespec *timeout = NULL , int flag = 0, void * user_data = NULL ); |
| | | |
| | | /** |
| | | * 向node_arr 中的所有网络节点发布消息 |
| | |
| | | } |
| | | |
| | | |
| | | int net_mod_socket_recvandsend(void *_socket, void **recvbuf, int *recvsize, int *key, recv_callback_fn callback) { |
| | | 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); |
| | | 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 ) { |
| | | int sec, int nsec, void * user_data) { |
| | | NetModSocket *sockt = (NetModSocket *)_socket; |
| | | struct timespec timeout = {sec, nsec}; |
| | | return sockt->recvandsend_timeout( recvbuf, recvsize, key, callback, &timeout); |
| | | 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) { |
| | | 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_nowait( recvbuf, recvsize, key, callback); |
| | | return sockt->recvandsend( recvbuf, recvsize, key, callback, NULL, BUS_NOWAIT_FLAG, user_data); |
| | | } |
| | | |
| | | |
| | |
| | | * @param recvbuf 接受到的消息存放的缓存地址,该buf使用完成后需要手动释放 |
| | | * @param recvsize 接受到消息的长度 |
| | | * @param key 从谁哪里收到的信息 |
| | | * @callback void (*recv_callback_fn)(void **sendbuf, int *sendsize) |
| | | * @callback void (*recv_callback_fn)(void **sendbuf, int *sendsize, void * user_data) |
| | | * sendbuf 和 sendsize是callbak_fn回调函数的返回值, 分别表示返回的数据,和返回数据的长度。 |
| | | * |
| | | * @return 0是成功, 其他值是失败的错误码 |
| | | */ |
| | | int net_mod_socket_recvandsend(void *_socket, void **recvbuf, int *recvsize, int *key, recv_callback_fn callback); |
| | | int net_mod_socket_recvandsend(void *_socket, void **recvbuf, int *recvsize, int *key, recv_callback_fn callback, void * user_data); |
| | | |
| | | /** |
| | | * @brief 接受消息,并把callback函数返回的数据发送回对方,在指定的时间内即使没有完成也返回 |
| | |
| | | * @param recvbuf 接受到的消息存放的缓存地址,该buf使用完成后需要手动释放 |
| | | * @param recvsize 接受到消息的长度 |
| | | * @param key 从谁哪里收到的信息 |
| | | * @callback void (*recv_callback_fn)(void **sendbuf, int *sendsize) |
| | | * @callback void (*recv_callback_fn)(void **sendbuf, int *sendsize, void * user_data) |
| | | * sendbuf 和 sendsize是callbak_fn回调函数的返回值, 分别表示返回的数据,和返回数据的长度。 |
| | | * |
| | | * @param sec 秒 |
| | |
| | | * @return 0是成功, 其他值是失败的错误码 |
| | | */ |
| | | int net_mod_socket_recvandsend_timeout(void *_socket, void **recvbuf, int *recvsize, int *key, recv_callback_fn callback, |
| | | int sec, int nsec ) ; |
| | | int sec, int nsec, void * user_data ) ; |
| | | |
| | | |
| | | /** |
| | |
| | | * @param recvbuf 接受到的消息存放的缓存地址,该buf使用完成后需要手动释放 |
| | | * @param recvsize 接受到消息的长度 |
| | | * @param key 从谁哪里收到的信息 |
| | | * @callback void (*recv_callback_fn)(void **sendbuf, int *sendsize) |
| | | * @callback void (*recv_callback_fn)(void **sendbuf, int *sendsize, void * user_data) |
| | | * sendbuf 和 sendsize是callbak_fn回调函数的返回值, 分别表示返回的数据,和返回数据的长度。 |
| | | * |
| | | * @return 0是成功, 其他值是失败的错误码 |
| | | */ |
| | | int net_mod_socket_recvandsend_nowait(void *_socket, void **recvbuf, int *recvsize, int *key, recv_callback_fn callback) ; |
| | | int net_mod_socket_recvandsend_nowait(void *_socket, void **recvbuf, int *recvsize, int *key, recv_callback_fn callback, void * user_data) ; |
| | | |
| | | |
| | | |
| | |
| | | |
| | | |
| | | int ShmModSocket::recvandsend(void **recvbuf, int *recvsize, int *key, recv_callback_fn callback, |
| | | const struct timespec *timeout , int flag ) { |
| | | int rv = shm_recvandsend(shm_socket, recvbuf, recvsize, key, callback, timeout, flag); |
| | | 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; |
| | |
| | | |
| | | |
| | | int recvandsend(void **recvbuf, int *recvsize, int *key, recv_callback_fn callback, |
| | | const struct timespec *timeout = NULL , int flag = 0); |
| | | const struct timespec *timeout = NULL , int flag = 0, void * user_data = NULL); |
| | | |
| | | /** |
| | | * 订阅指定主题 |
| | |
| | | * |
| | | */ |
| | | int shm_recvandsend(shm_socket_t *sockt, void **recvbuf, int *recvsize, int *key, recv_callback_fn callback, |
| | | const struct timespec *timeout, int flag) { |
| | | const struct timespec *timeout, int flag, void *user_data) { |
| | | |
| | | int rv; |
| | | |
| | |
| | | |
| | | mm_free(recvpak.buf); |
| | | |
| | | callback(&sendbuf, &sendsize); |
| | | callback(&sendbuf, &sendsize, user_data); |
| | | |
| | | shm_packet_t sendpak; |
| | | sendpak.key = sockt->key; |
| | |
| | | } shm_socket_t; |
| | | |
| | | // typedef void (*recv_callback_fn)(void **sendbuf, int *sendsize); |
| | | typedef std::function<void(void **sendbuf, int *sendsize)> recv_callback_fn; |
| | | typedef std::function<void(void **sendbuf, int *sendsize, void *user_data)> recv_callback_fn; |
| | | |
| | | size_t shm_socket_remove_keys(int keys[], size_t length); |
| | | |
| | |
| | | * |
| | | */ |
| | | int shm_recvandsend(shm_socket_t *sockt, void **recvbuf, int *recvsize, int *key, recv_callback_fn callback, |
| | | const struct timespec *timeout = NULL, int flag = 0); |
| | | const struct timespec *timeout = NULL, int flag = 0, void * user_data = NULL); |
| | | |
| | | |
| | | |
| | |
| | | int rv; |
| | | int key; |
| | | while(true) { |
| | | rv = net_mod_socket_recvandsend_timeout(ser, &recvbuf, &recvsize, &key, [&](void ** buf, int *size){ |
| | | 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); |
| | | sprintf(sendbuf, "%d RECEIVED %s", net_mod_socket_get_key(ser), (char *)recvbuf); |
| | | // buf 和 size是返回值 |
| | |
| | | *size = strlen(sendbuf) + 1; |
| | | free(recvbuf); |
| | | return; |
| | | }, 0, 2000000 ); |
| | | }, 0, 2000000, NULL ); |
| | | } |
| | | // while ( (rv = net_mod_socket_recvfrom(ser, &recvbuf, &size, &key) ) == 0) { |
| | | // // printf( "server: RECEIVED REQUEST FROM %d NAME %s\n", key, recvbuf); |
| | |
| | | #include <getopt.h> |
| | | #include "logger_factory.h" |
| | | |
| | | //测试传递函数指针 |
| | | |
| | | |
| | | void sendback(void ** buf, int *size){ |
| | | void sendback(void ** buf, int *size, void * user_data){ |
| | | char sendbuf[512]; |
| | | printf( "server: RECEIVED REQUEST FROM \n "); |
| | | sprintf(sendbuf, "RECEIVED REQUEST \n"); |
| | |
| | | int rv; |
| | | int key; |
| | | while(true) { |
| | | rv = net_mod_socket_recvandsend_timeout(ser, &recvbuf, &recvsize, &key, sendback, 2, 2000000 ); |
| | | rv = net_mod_socket_recvandsend_timeout(ser, &recvbuf, &recvsize, &key, sendback, 2, 2000000, NULL ); |
| | | if(rv == 0) |
| | | free(recvbuf); |
| | | } |