--- deliantra/server/socket/init.C 2007/03/14 15:44:47 1.41 +++ deliantra/server/socket/init.C 2007/04/02 18:54:00 1.42 @@ -63,6 +63,8 @@ { refcnt_inc (); // the socket is an external reference + mss = 1500 - 66; // 1500 typical ethernet frame, 66 typical tcp header overhead + { struct linger linger_opt; @@ -74,38 +76,47 @@ } { - int val = IPTOS_LOWDELAY; + int val; +#ifdef IP_TOS + val = IPTOS_LOWDELAY; if (setsockopt (fd, IPPROTO_IP, IP_TOS, &val, sizeof (val))) LOG (llevError, "IP_TOS: %s\n", strerror (errno)); - } - - { - int val = 1; +#endif +#ifdef TCP_NODELAY + val = 1; if (setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, &val, sizeof (val))) LOG (llevError, "TCP_NODELAY: %s\n", strerror (errno)); - } +#endif -#ifdef __linux__ - { - int val; + // set some very aggressive keepalive parameters +#ifdef TCP_KEEPIDLE + val = 10; + if (setsockopt (fd, IPPROTO_TCP, TCP_KEEPIDLE, &val, sizeof (val))) + LOG (llevError, "TCP_KEEPIDLE: %s\n", strerror (errno)); +#endif - // set some very aggressive keepalive parameters - val = 10; - if (setsockopt (fd, IPPROTO_TCP, TCP_KEEPIDLE, &val, sizeof (val))) - LOG (llevError, "TCP_KEEPIDLE: %s\n", strerror (errno)); - - val = 5; - if (setsockopt (fd, IPPROTO_TCP, TCP_KEEPCNT, &val, sizeof (val))) - LOG (llevError, "TCP_KEEPCNT: %s\n", strerror (errno)); - - val = 1; - if (setsockopt (fd, IPPROTO_TCP, TCP_KEEPINTVL, &val, sizeof (val))) - LOG (llevError, "TCP_KEEPINTVL: %s\n", strerror (errno)); - } +#ifdef TCP_KEEPCNT + val = 5; + if (setsockopt (fd, IPPROTO_TCP, TCP_KEEPCNT, &val, sizeof (val))) + LOG (llevError, "TCP_KEEPCNT: %s\n", strerror (errno)); +#endif + +#ifdef TCP_KEEPINTVL + val = 1; + if (setsockopt (fd, IPPROTO_TCP, TCP_KEEPINTVL, &val, sizeof (val))) + LOG (llevError, "TCP_KEEPINTVL: %s\n", strerror (errno)); #endif + // try to find the mss value in use +#ifdef TCP_MAXSEG + socklen_t sl = sizeof (val); + if (!getsockopt (fd, IPPROTO_TCP, TCP_MAXSEG, &val, &sl) && sl == sizeof (val)) + mss = val; +#endif + } + { int bufsize = 65535; /*Supposed absolute upper limit */ int oldbufsize;