diff --git a/mtapi_network_c/src/embb_mtapi_network_socket.c b/mtapi_network_c/src/embb_mtapi_network_socket.c index ad71af6..c148b9d 100644 --- a/mtapi_network_c/src/embb_mtapi_network_socket.c +++ b/mtapi_network_c/src/embb_mtapi_network_socket.c @@ -67,7 +67,8 @@ void embb_mtapi_network_socket_finalize( int embb_mtapi_network_socket_bind_and_listen( embb_mtapi_network_socket_t * that, char const * host, - uint16_t port) { + uint16_t port, + uint16_t max_connections) { struct sockaddr_in in_addr; int reuseaddr_on = 1; @@ -89,7 +90,7 @@ int embb_mtapi_network_socket_bind_and_listen( return 0; } - if (SOCKET_ERROR == listen(that->handle, 5)) { + if (SOCKET_ERROR == listen(that->handle, max_connections)) { return 0; } @@ -132,38 +133,45 @@ int embb_mtapi_network_socket_connect( } int embb_mtapi_network_socket_select( - embb_mtapi_network_socket_t * that, + embb_mtapi_network_socket_t * sockets, + int count, int timeout ) { fd_set read_set; - int max_fd; + embb_mtapi_network_socket_t max_fd = { 0 }; int err; + int ii; struct timeval tv; tv.tv_sec = timeout / 1000; tv.tv_usec = timeout % 1000; FD_ZERO(&read_set); - FD_SET(that->handle, &read_set); - max_fd = that->handle; + for (ii = 0; ii < count; ii++) { + FD_SET(sockets[ii].handle, &read_set); + if (sockets[ii].handle > max_fd.handle) + max_fd.handle = sockets[ii].handle; + } if (timeout >= 0) { - err = select(max_fd + 1, &read_set, NULL, NULL, &tv); + err = select(max_fd.handle + 1, &read_set, NULL, NULL, &tv); } else { - err = select(max_fd + 1, &read_set, NULL, NULL, NULL); + err = select(max_fd.handle + 1, &read_set, NULL, NULL, NULL); } if (0 == err) { // timeout - return 0; + return -1; } if (SOCKET_ERROR == err) { - return 0; + return -1; } - if (FD_ISSET(that->handle, &read_set)) { - return 1; + for (ii = 0; ii < count; ii++) { + if (FD_ISSET(sockets[ii].handle, &read_set)) { + return ii; + } } - return 0; + return -1; } int embb_mtapi_network_socket_sendbuffer( @@ -177,10 +185,12 @@ int embb_mtapi_network_socket_sendbuffer( } } -int embb_mtapi_network_socket_recvbuffer( +int embb_mtapi_network_socket_recvbuffer_sized( embb_mtapi_network_socket_t * that, - embb_mtapi_network_buffer_t * buffer) { + embb_mtapi_network_buffer_t * buffer, + int size) { int err; + /* #ifdef _WIN32 u_long bytes_available = 0; if (0 != ioctlsocket(that->handle, FIONREAD, &bytes_available)) @@ -189,11 +199,22 @@ int embb_mtapi_network_socket_recvbuffer( if (0 != ioctl(that->handle, FIONREAD, &bytes_available)) #endif return 0; - if (buffer->capacity > (int)bytes_available) + */ + if (buffer->capacity < size) + return 0; + /* + if (size > (int)bytes_available) return 0; - err = recv(that->handle, buffer->data, buffer->capacity, 0); - if (err != buffer->capacity) + */ + err = recv(that->handle, buffer->data, size, 0); + if (err != size) return 0; - buffer->size = buffer->capacity; + buffer->size = size; return buffer->size; } + +int embb_mtapi_network_socket_recvbuffer( + embb_mtapi_network_socket_t * that, + embb_mtapi_network_buffer_t * buffer) { + return embb_mtapi_network_socket_recvbuffer_sized(that, buffer, buffer->capacity); +} diff --git a/mtapi_network_c/src/embb_mtapi_network_socket.h b/mtapi_network_c/src/embb_mtapi_network_socket.h index 5cb4948..4d6ec5f 100644 --- a/mtapi_network_c/src/embb_mtapi_network_socket.h +++ b/mtapi_network_c/src/embb_mtapi_network_socket.h @@ -56,7 +56,8 @@ void embb_mtapi_network_socket_finalize( int embb_mtapi_network_socket_bind_and_listen( embb_mtapi_network_socket_t * that, char const * host, - uint16_t port + uint16_t port, + uint16_t max_connections ); int embb_mtapi_network_socket_accept( @@ -71,7 +72,8 @@ int embb_mtapi_network_socket_connect( ); int embb_mtapi_network_socket_select( - embb_mtapi_network_socket_t * that, + embb_mtapi_network_socket_t * sockets, + int count, int timeout ); @@ -85,6 +87,12 @@ int embb_mtapi_network_socket_recvbuffer( embb_mtapi_network_buffer_t * buffer ); +int embb_mtapi_network_socket_recvbuffer_sized( + embb_mtapi_network_socket_t * that, + embb_mtapi_network_buffer_t * buffer, + int size +); + #ifdef __cplusplus } #endif diff --git a/mtapi_network_c/test/embb_mtapi_network_test_socket.cc b/mtapi_network_c/test/embb_mtapi_network_test_socket.cc index 0f02bf7..b4cf8e6 100644 --- a/mtapi_network_c/test/embb_mtapi_network_test_socket.cc +++ b/mtapi_network_c/test/embb_mtapi_network_test_socket.cc @@ -52,33 +52,33 @@ void NetworkSocketTest::TestBasic() { err = embb_mtapi_network_socket_initialize(&server_sock); PT_EXPECT(err != 0); - err = embb_mtapi_network_socket_bind_and_listen(&server_sock, "127.0.0.1", 4711); + err = embb_mtapi_network_socket_bind_and_listen(&server_sock, "127.0.0.1", 4711, 5); PT_EXPECT(err != 0); - err = embb_mtapi_network_socket_select(&server_sock, 1); - PT_EXPECT(err == 0); + err = embb_mtapi_network_socket_select(&server_sock, 1, 1); + PT_EXPECT(err == -1); err = embb_mtapi_network_socket_initialize(&client_sock); PT_EXPECT(err != 0); err = embb_mtapi_network_socket_connect(&client_sock, "127.0.0.1", 4711); PT_EXPECT(err != 0); - err = embb_mtapi_network_socket_select(&server_sock, -1); - PT_EXPECT(err != 0); + err = embb_mtapi_network_socket_select(&server_sock, 1, -1); + PT_EXPECT(err == 0); err = embb_mtapi_network_socket_accept(&server_sock, &accept_sock); PT_EXPECT(err != 0); - err = embb_mtapi_network_socket_select(&accept_sock, 1); - PT_EXPECT(err == 0); + err = embb_mtapi_network_socket_select(&accept_sock, 1, 1); + PT_EXPECT(err == -1); err = embb_mtapi_network_buffer_push_back_int32(&send_buffer, 0x12345678); PT_EXPECT(err == 4); err = embb_mtapi_network_socket_sendbuffer(&client_sock, &send_buffer); PT_EXPECT(err == 4); - err = embb_mtapi_network_socket_select(&accept_sock, -1); - PT_EXPECT(err != 0); + err = embb_mtapi_network_socket_select(&accept_sock, 1, -1); + PT_EXPECT(err == 0); err = embb_mtapi_network_socket_recvbuffer(&accept_sock, &recv_buffer); PT_EXPECT(err == 4);