| | |
| | | } |
| | | |
| | | |
| | | int net_mod_socket_recvandsend(void *_socket, recvandsend_callback_fn callback, void * user_data) { |
| | | int net_mod_socket_recvandsend(void *_socket, recvandsend_callback_wrapper_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 net_mod_socket_recvandsend_timeout(void *_socket, recvandsend_callback_wrapper_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) { |
| | | int net_mod_socket_recvandsend_nowait(void *_socket, recvandsend_callback_wrapper_fn callback, void * user_data) { |
| | | NetModSocket *sockt = (NetModSocket *)_socket; |
| | | return sockt->recvandsend( callback, NULL, BUS_NOWAIT_FLAG, user_data); |
| | | } |
| | |
| | | #endif |
| | | |
| | | |
| | | typedef void (*recvandsend_callback_wrapper_fn)(void *recvbuf, int recvsize, int key, void **sendbuf, int *sendsize, void * user_data); |
| | | |
| | | |
| | | |
| | |
| | | /** |
| | | * @brief 接受消息,并把callback函数返回的数据发送回对方,一直等待完成 |
| | | * |
| | | * @callback void (*recvandsend_callback_fn)(void *recvbuf, int recvsize, int key, void **sendbuf, int *sendsize, void * user_data) |
| | | * @callback void (*recvandsend_callback_wrapper_fn)(void *recvbuf, int recvsize, int key, void **sendbuf, int *sendsize, void * user_data) |
| | | * @recvbuf 收到的数据, 该recvbuf使用完成后需要手动释放 |
| | | * @recvsize 收到的数据的大小 |
| | | * @key 接受数据并发送数据的对象 |
| | |
| | | * |
| | | * @return 0是成功, 其他值是失败的错误码 |
| | | */ |
| | | int net_mod_socket_recvandsend(void *_socket, recvandsend_callback_fn callback, void * user_data); |
| | | int net_mod_socket_recvandsend(void *_socket, recvandsend_callback_wrapper_fn callback, void * user_data); |
| | | |
| | | /** |
| | | * @brief 接受消息,并把callback函数返回的数据发送回对方,在指定的时间内即使没有完成也返回 |
| | | * |
| | | * @callback void (*recvandsend_callback_fn)(void *recvbuf, int recvsize, int key, void **sendbuf, int *sendsize, void * user_data) |
| | | * @callback void (*recvandsend_callback_wrapper_fn)(void *recvbuf, int recvsize, int key, void **sendbuf, int *sendsize, void * user_data) |
| | | * @recvbuf 收到的数据, 该recvbuf使用完成后需要手动释放 |
| | | * @recvsize 收到的数据的大小 |
| | | * @key 接受数据并发送数据的对象 |
| | |
| | | * |
| | | * @return 0是成功, 其他值是失败的错误码 |
| | | */ |
| | | int net_mod_socket_recvandsend_timeout(void *_socket, recvandsend_callback_fn callback, |
| | | int net_mod_socket_recvandsend_timeout(void *_socket, recvandsend_callback_wrapper_fn callback, |
| | | int sec, int nsec, void * user_data ) ; |
| | | |
| | | |
| | | /** |
| | | * @brief 接受消息,并把callback函数返回的数据发送回对方,无论成功与否立刻返回 |
| | | * |
| | | * @callback void (*recvandsend_callback_fn)(void *recvbuf, int recvsize, int key, void **sendbuf, int *sendsize, void * user_data) |
| | | * @callback void (*recvandsend_callback_wrapper_fn)(void *recvbuf, int recvsize, int key, void **sendbuf, int *sendsize, void * user_data) |
| | | * @recvbuf 收到的数据, 该recvbuf使用完成后需要手动释放 |
| | | * @recvsize 收到的数据的大小 |
| | | * @key 接受数据并发送数据的对象 |
| | |
| | | * |
| | | * @return 0是成功, 其他值是失败的错误码 |
| | | */ |
| | | int net_mod_socket_recvandsend_nowait(void *_socket, recvandsend_callback_fn callback, void * user_data) ; |
| | | int net_mod_socket_recvandsend_nowait(void *_socket, recvandsend_callback_wrapper_fn callback, void * user_data) ; |
| | | |
| | | |
| | | /** |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | void *ser; |
| | | static void _recvandsend_callback_(void *recvbuf, int recvsize, int key, void **sendbuf_ptr, int *sendsize_ptr, void * user_data) { |
| | | char sendbuf[512]; |
| | | 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是返回值 |
| | | *sendbuf_ptr = sendbuf; |
| | | *sendsize_ptr = strlen(sendbuf) + 1; |
| | | //recvbuf是分配到堆里的,使用完后不要忘记释放掉 |
| | | free(recvbuf); |
| | | return; |
| | | } |
| | | |
| | | |
| | | void start_reply(int mkey) { |
| | | printf("start reply\n"); |
| | | void *ser = net_mod_socket_open(); |
| | | ser = net_mod_socket_open(); |
| | | net_mod_socket_bind(ser, mkey); |
| | | char sendbuf[512]; |
| | | |
| | | int rv; |
| | | while(true) { |
| | | 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是返回值 |
| | | *sendbuf_ptr = sendbuf; |
| | | *sendsize_ptr = strlen(sendbuf) + 1; |
| | | //recvbuf是分配到堆里的,使用完后不要忘记释放掉 |
| | | free(recvbuf); |
| | | return; |
| | | }, 0, 2000000, NULL ); |
| | | rv = net_mod_socket_recvandsend_timeout(ser, _recvandsend_callback_ , 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); |