diff --git a/Common/GmshSocket.h b/Common/GmshSocket.h index 66ba024387503beb990625d4c5319b58b49258d6..b2905a2f3f8017252c500c891b34b63778f088bb 100644 --- a/Common/GmshSocket.h +++ b/Common/GmshSocket.h @@ -280,6 +280,7 @@ class GmshClient : public GmshSocket { _sock = socket(AF_INET, SOCK_STREAM, 0); if(_sock < 0) return -1; char one = 1; + // disable Nagle's algorithm (very slow for many small messages) setsockopt(_sock, IPPROTO_TCP, TCP_NODELAY, &one, sizeof(one)); // try to connect socket to host:port const char *port = strstr(sockname, ":"); diff --git a/utils/solvers/c++/GmshSocket.h b/utils/solvers/c++/GmshSocket.h index 42664f85263cbdd70bf3c5e8a52112edf4ee746a..f2e28096e4cd0c65ac3c0658180fe9bcadb273c8 100644 --- a/utils/solvers/c++/GmshSocket.h +++ b/utils/solvers/c++/GmshSocket.h @@ -45,6 +45,7 @@ #include <sys/un.h> #include <sys/time.h> #include <netinet/in.h> +#include <netinet/tcp.h> #include <netdb.h> #if defined(HAVE_NO_SOCKLEN_T) typedef int socklen_t; @@ -276,6 +277,9 @@ class GmshClient : public GmshSocket { // TCP/IP socket _sock = socket(AF_INET, SOCK_STREAM, 0); if(_sock < 0) return -1; + char one = 1; + // disable Nagle's algorithm (very slow for many small messages) + setsockopt(_sock, IPPROTO_TCP, TCP_NODELAY, &one, sizeof(one)); // try to connect socket to host:port const char *port = strstr(sockname, ":"); int portno = atoi(port + 1); @@ -324,13 +328,13 @@ class GmshServer : public GmshSocket{ public: GmshServer() : GmshSocket(), _portno(-1) {} virtual ~GmshServer(){} - virtual int NonBlockingSystemCall(const char *exe, const char *args) = 0; + virtual int NonBlockingSystemCall(const std::string &exe, const std::string &args) = 0; virtual int NonBlockingWait(double waitint, double timeout, int socket=-1) = 0; // start the client by launching "exe args" (args is supposed to contain // '%s' where the socket name should appear) - int Start(const char *exe, const char *args, const char *sockname, double timeout) + int Start(const std::string &exe, const std::string &args, const std::string &sockname, + double timeout) { - if(!sockname) throw "Invalid (null) socket name"; _sockname = sockname; int tmpsock; if(strstr(_sockname.c_str(), "/") || strstr(_sockname.c_str(), "\\") || @@ -366,6 +370,9 @@ class GmshServer : public GmshSocket{ _portno = atoi(port + 1); // create a socket tmpsock = socket(AF_INET, SOCK_STREAM, 0); + char one = 1; + setsockopt(tmpsock, IPPROTO_TCP, TCP_NODELAY, &one, sizeof(one)); + #if !defined(WIN32) || defined(__CYGWIN__) if(tmpsock < 0) #else @@ -393,9 +400,9 @@ class GmshServer : public GmshSocket{ } } - if((exe && strlen(exe)) || (args && strlen(args))){ + if(exe.size() || args.size()){ char s[1024]; - sprintf(s, args, _sockname.c_str()); + sprintf(s, args.c_str(), _sockname.c_str()); NonBlockingSystemCall(exe, s); // starts the solver } else{ @@ -433,9 +440,10 @@ class GmshServer : public GmshSocket{ struct sockaddr_in from_in; socklen_t len = sizeof(from_in); _sock = accept(tmpsock, (struct sockaddr *)&from_in, &len); + char one = 1; + setsockopt(_sock, IPPROTO_TCP, TCP_NODELAY, &one, sizeof(one)); } CloseSocket(tmpsock); - if(_sock < 0) throw "Socket accept failed"; return _sock;