From 9b2f8930538630db8537b8c5601e8c4a9c074657 Mon Sep 17 00:00:00 2001 From: Denis Fokin Date: Sun, 15 Mar 2015 17:49:30 +0200 Subject: [PATCH] Properly close socket on WIN32 to allow accepting further connections --- gdbserver/gdb-server.c | 13 +++++++++++++ mingw/mingw.c | 10 ++++++---- mingw/mingw.h | 1 + 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/gdbserver/gdb-server.c b/gdbserver/gdb-server.c index daacb85..b1cea5c 100644 --- a/gdbserver/gdb-server.c +++ b/gdbserver/gdb-server.c @@ -733,6 +733,9 @@ int serve(stlink_t *sl, st_state_t *st) { int status = gdb_recv_packet(client, &packet); if(status < 0) { ELOG("cannot recv: %d\n", status); +#ifdef __MINGW32__ + win32_close_socket(sock); +#endif return 1; } @@ -942,6 +945,9 @@ int serve(stlink_t *sl, st_state_t *st) { int status = gdb_check_for_interrupt(client); if(status < 0) { ELOG("cannot check for int: %d\n", status); +#ifdef __MINGW32__ + win32_close_socket(sock); +#endif return 1; } @@ -1256,6 +1262,9 @@ int serve(stlink_t *sl, st_state_t *st) { ELOG("cannot send: %d\n", result); free(reply); free(packet); +#ifdef __MINGW32__ + win32_close_socket(sock); +#endif return 1; } @@ -1265,5 +1274,9 @@ int serve(stlink_t *sl, st_state_t *st) { free(packet); } +#ifdef __MINGW32__ + win32_close_socket(sock); +#endif + return 0; } diff --git a/mingw/mingw.c b/mingw/mingw.c index 266a87c..3c5d025 100644 --- a/mingw/mingw.c +++ b/mingw/mingw.c @@ -163,14 +163,16 @@ win32_shutdown(SOCKET fd, int mode) } return rc; } -int win32_close_socket(SOCKET fd) { - int rc; - rc = closesocket(fd); +int win32_close_socket(SOCKET fd) +{ + int rc = closesocket(fd); + if(rc == SOCKET_ERROR) { + set_socket_errno(WSAGetLastError()); + } return rc; } - ssize_t win32_write_socket(SOCKET fd, void *buf, int n) { int rc = send(fd, buf, n, 0); diff --git a/mingw/mingw.h b/mingw/mingw.h index 28c7a82..1fcf93d 100644 --- a/mingw/mingw.h +++ b/mingw/mingw.h @@ -54,6 +54,7 @@ SOCKET win32_socket(int, int, int); int win32_connect(SOCKET, struct sockaddr*, socklen_t); SOCKET win32_accept(SOCKET, struct sockaddr*, socklen_t *); int win32_shutdown(SOCKET, int); +int win32_close_socket(SOCKET fd); #define strtok_r(x, y, z) win32_strtok_r(x, y, z) #define strsep(x,y) win32_strsep(x,y) -- 2.30.2