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;