diff --git a/Common/DefaultOptions.h b/Common/DefaultOptions.h index 234f7091c1fd7541f23b39af96054d91c57dd0f8..eda386c866116dabd1eb7f15611a3b463488c36c 100644 --- a/Common/DefaultOptions.h +++ b/Common/DefaultOptions.h @@ -95,7 +95,7 @@ StringXString MeshOptions_String[] = { StringXString SolverOptions_String[] = { { F|O, "SocketName" , opt_solver_socket_name , #if defined(WIN32) && !defined(__CYGWIN__) - ":44122" , // use TCP/IP sockets by default on Windows + "localhost:44122" , // use TCP/IP sockets by default on Windows #else ".gmshsock" , // otherwise use Unix sockets by default #endif diff --git a/Common/GmshSocket.h b/Common/GmshSocket.h index 4aa46ad38956cc673246e299309c819ba4bce071..d6b251c96ca1f203a2baf00d7ff7a57b4a08e312 100644 --- a/Common/GmshSocket.h +++ b/Common/GmshSocket.h @@ -106,12 +106,8 @@ class GmshSocket{ GmshSocket() : _sock(0), _sockname(0) { #if defined(WIN32) && !defined(__CYGWIN__) - static bool first = true; - if(first){ - first = false; - WSADATA wsaData; - WSAStartup(MAKEWORD(2, 2), &wsaData); - } + WSADATA wsaData; + WSAStartup(MAKEWORD(2, 2), &wsaData); #endif } ~GmshSocket() @@ -171,6 +167,14 @@ class GmshSocket{ } return 0; } + void CloseSocket(int s) + { +#if !defined(WIN32) || defined(__CYGWIN__) + close(s); +#else + closesocket(s); +#endif + } }; class GmshClient : public GmshSocket { @@ -217,8 +221,10 @@ class GmshClient : public GmshSocket { strncpy(remote, sockname, remotelen); remote[remotelen] = '\0'; struct hostent *server; - if(!(server = gethostbyname(remote))) + if(!(server = gethostbyname(remote))){ + CloseSocket(_sock); return -3; // Error: No such host + } struct sockaddr_in addr_in; memset((char *) &addr_in, 0, sizeof(addr_in)); addr_in.sin_family = AF_INET; @@ -230,6 +236,7 @@ class GmshClient : public GmshSocket { _Sleep(100); } } + CloseSocket(_sock); return -2; // Error: Couldn't connect } void Start() @@ -258,14 +265,7 @@ class GmshClient : public GmshSocket { if(num > 5) num = 5; SendString(CLIENT_OPTION_1 + num - 1, str); } - void Disconnect() - { -#if !defined(WIN32) || defined(__CYGWIN__) - close(_sock); -#else - closesocket(_sock); -#endif - } + void Disconnect(){ CloseSocket(_sock); } }; class GmshServer : public GmshSocket{ @@ -278,7 +278,7 @@ class GmshServer : public GmshSocket{ virtual int NonBlockingWait(int socket, int num, double waitint) = 0; int StartClient(const char *command, const char *sockname=0, int maxdelay=4) { - int justwait = (!command || !strlen(command)); + bool justwait = (!command || !strlen(command)); _sockname = sockname; // no socket? launch the command directly @@ -329,8 +329,10 @@ class GmshServer : public GmshSocket{ addr_in.sin_family = AF_INET; addr_in.sin_addr.s_addr = INADDR_ANY; addr_in.sin_port = htons(_portno); - if(bind(tmpsock, (struct sockaddr *)&addr_in, sizeof(addr_in)) < 0) + if(bind(tmpsock, (struct sockaddr *)&addr_in, sizeof(addr_in)) < 0){ + CloseSocket(tmpsock); return -2; // Error: Couldn't bind socket to name + } } if(!justwait) @@ -338,19 +340,25 @@ class GmshServer : public GmshSocket{ // listen on socket (queue up to 20 connections before having // them automatically rejected) - if(listen(tmpsock, 20)) + if(listen(tmpsock, 20)){ + CloseSocket(tmpsock); return -3; // Error: Socket listen failed + } if(justwait){ // wait indefinitely until we get data - if(NonBlockingWait(tmpsock, -1, 0.5)) + if(NonBlockingWait(tmpsock, -1, 0.5)){ + CloseSocket(tmpsock); return -6; // not an actual error: we just stopped listening + } } else{ // Wait at most maxdelay seconds for data, issue error if no // connection in that amount of time - if(!Select(tmpsock, maxdelay)) + if(!Select(tmpsock, maxdelay)){ + CloseSocket(tmpsock); return -4; // Error: Socket listening timeout + } } // accept connection request @@ -373,14 +381,10 @@ class GmshServer : public GmshSocket{ len = sizeof(from_in); _sock = accept(tmpsock, (struct sockaddr *)&from_in, &len); } - if(_sock < 0) return -5; // Error: Socket accept failed + CloseSocket(tmpsock); - // close temporary socket -#if !defined(WIN32) || defined(__CYGWIN__) - close(tmpsock); -#else - closesocket(tmpsock); -#endif + if(_sock < 0) + return -5; // Error: Socket accept failed return _sock; } int StopClient() @@ -388,10 +392,8 @@ class GmshServer : public GmshSocket{ #if !defined(WIN32) || defined(__CYGWIN__) if(_portno < 0) unlink(_sockname); - close(_sock); -#else - closesocket(_sock); #endif + CloseSocket(_sock); return 0; } };