tWin32 non-blocking connect() now should test properly for failure - vaccinewars - be a doctor and try to vaccinate the world (HTM) git clone git://src.adamsgaard.dk/vaccinewars (DIR) Log (DIR) Files (DIR) Refs (DIR) README (DIR) LICENSE --- (DIR) commit c31fa3d09f2d3758cb7f5544bdb3fb3f92534ce3 (DIR) parent 536f83dc641355f75758ab293c669e39c903d1a1 (HTM) Author: Ben Webb <ben@salilab.org> Date: Wed, 20 Dec 2000 19:59:41 +0000 Win32 non-blocking connect() now should test properly for failure Diffstat: M src/dopeos.c | 12 +++++++++++- M src/dopeos.h | 3 --- M src/gtk.c | 4 ++++ M src/gtk.h | 2 ++ M src/message.c | 17 +++++++++++++++-- 5 files changed, 32 insertions(+), 6 deletions(-) --- (DIR) diff --git a/src/dopeos.c b/src/dopeos.c t@@ -29,6 +29,9 @@ #ifdef CYGWIN /* Code for native Win32 build under Cygwin */ #include <conio.h> +#ifdef GUI_CLIENT +#include "gtk.h" +#endif CHAR_INFO RealScreen[25][80],VirtualScreen[25][80]; HANDLE hOut,hIn; t@@ -274,7 +277,14 @@ int bselect(int nfds,fd_set *readfds,fd_set *writefds,fd_set *exceptfds, } #if NETWORKING -int GetSocketError() { return WSAGetLastError(); } +int GetSocketError() { +#ifdef GUI_CLIENT + if (AsyncSocketError) return AsyncSocketError; + else +#endif +return WSAGetLastError(); +} + void fcntl(SOCKET s,int fsetfl,long cmd) { unsigned long param=1; ioctlsocket(s,cmd,¶m); (DIR) diff --git a/src/dopeos.h b/src/dopeos.h t@@ -122,9 +122,6 @@ void fcntl(SOCKET s,int fsetfl,long cmd); void StartNetworking(); void StopNetworking(); void SetReuse(SOCKET sock); -#define EPIPE WSAECONNRESET -#define EINPROGRESS WSAEWOULDBLOCK -#define EAGAIN WSAEWOULDBLOCK #endif #else /* Definitions for Unix build */ (DIR) diff --git a/src/gtk.c b/src/gtk.c t@@ -554,6 +554,7 @@ static HFONT hFont; static GSList *WindowList=NULL; static GSList *GdkInputs=NULL; static HWND TopLevel=NULL; +long AsyncSocketError=0; static void gtk_set_default_font(HWND hWnd) { SendMessage(hWnd,WM_SETFONT,(WPARAM)hFont,MAKELPARAM(FALSE,0)); t@@ -778,7 +779,9 @@ LRESULT CALLBACK MainWndProc(HWND hwnd,UINT msg,UINT wParam,LONG lParam) { } break; case WM_SOCKETDATA: + AsyncSocketError=WSAGETSELECTERROR(lParam); DispatchSocketEvent((SOCKET)wParam,WSAGETSELECTEVENT(lParam)); + AsyncSocketError=0; break; default: return DefWindowProc(hwnd,msg,wParam,lParam); t@@ -791,6 +794,7 @@ void win32_init(HINSTANCE hInstance,HINSTANCE hPrevInstance) { hInst=hInstance; hFont=(HFONT)GetStockObject(DEFAULT_GUI_FONT); WindowList=NULL; + AsyncSocketError=0; if (!hPrevInstance) { wc.style = CS_HREDRAW|CS_VREDRAW; wc.lpfnWndProc = MainWndProc; (DIR) diff --git a/src/gtk.h b/src/gtk.h t@@ -633,4 +633,6 @@ void gtk_spin_button_set_value(GtkSpinButton *spin_button,gfloat value); void gtk_spin_button_set_adjustment(GtkSpinButton *spin_button, GtkAdjustment *adjustment); +extern long AsyncSocketError; + #endif (DIR) diff --git a/src/message.c b/src/message.c t@@ -325,7 +325,11 @@ gboolean ReadConnectionBufferFromWire(Player *Play) { BytesRead=recv(Play->fd,&conn->Data[CurrentPosition], conn->Length-CurrentPosition,0); if (BytesRead==SOCKET_ERROR) { +#ifdef CYGWIN + if (GetSocketError()==WSAEWOULDBLOCK) break; else return FALSE; +#else if (GetSocketError()==EAGAIN) break; else return FALSE; +#endif } else if (BytesRead==0) { return FALSE; } else { t@@ -373,7 +377,11 @@ gboolean WriteConnectionBufferToWire(Player *Play) { BytesSent=send(Play->fd,&conn->Data[CurrentPosition], conn->DataPresent-CurrentPosition,0); if (BytesSent==SOCKET_ERROR) { +#ifdef CYGWIN + if (GetSocketError()==WSAEWOULDBLOCK) break; else return FALSE; +#else if (GetSocketError()==EAGAIN) break; else return FALSE; +#endif } else { CurrentPosition+=BytesSent; } t@@ -731,7 +739,11 @@ char *SetupNetwork(gboolean NonBlocking) { if (NonBlocking) fcntl(ClientSock,F_SETFL,O_NONBLOCK); if (connect(ClientSock,(struct sockaddr *)&ClientAddr, sizeof(struct sockaddr))==-1) { +#ifdef CYGWIN + if (GetSocketError()==WSAEWOULDBLOCK) return NULL; +#else if (GetSocketError()==EINPROGRESS) return NULL; +#endif CloseSocket(ClientSock); return NoConnect; } else { t@@ -742,12 +754,13 @@ char *SetupNetwork(gboolean NonBlocking) { } char *FinishSetupNetwork() { + static char NoConnect[]= N_("Connection refused or no server present"); #ifdef CYGWIN + if (GetSocketError()!=0) return NoConnect; Client=Network=TRUE; return NULL; #else int optval; - static char NoConnect[]= N_("Connection refused or no server present"); socklen_t optlen; optlen=sizeof(optval); t@@ -755,7 +768,7 @@ char *FinishSetupNetwork() { return NoConnect; } if (optval==0) { - Client=TRUE; Network=TRUE; + Client=Network=TRUE; return NULL; } else { return NoConnect;