… | |
… | |
56 | * client. |
56 | * client. |
57 | */ |
57 | */ |
58 | client::client (int fd, const char *peername) |
58 | client::client (int fd, const char *peername) |
59 | : fd (fd), host (strdup (peername)), |
59 | : fd (fd), host (strdup (peername)), |
60 | socket_ev (this, &client::socket_cb), |
60 | socket_ev (this, &client::socket_cb), |
61 | cmd_ev (this, &client::cmd_cb), |
61 | cmd_ev (this, &client::cmd_cb) |
62 | cc_inv (this), cc_other (this) |
|
|
63 | { |
62 | { |
64 | refcnt_inc (); // the socket is an external reference |
63 | refcnt_inc (); // the socket is an external reference |
|
|
64 | |
|
|
65 | mss = 1500 - 52; // 1500 typical ethernet frame, 66 typical tcp header overhead |
65 | |
66 | |
66 | { |
67 | { |
67 | struct linger linger_opt; |
68 | struct linger linger_opt; |
68 | |
69 | |
69 | linger_opt.l_onoff = 0; |
70 | linger_opt.l_onoff = 0; |
70 | linger_opt.l_linger = 0; |
71 | linger_opt.l_linger = 0; |
71 | |
72 | |
72 | if (setsockopt (fd, SOL_SOCKET, SO_LINGER, &linger_opt, sizeof (struct linger))) |
73 | if (setsockopt (fd, SOL_SOCKET, SO_LINGER, &linger_opt, sizeof (struct linger))) |
73 | LOG (llevError, "SO_LINGER: %s\n", strerror (errno)); |
74 | LOG (llevError, "SO_LINGER: %s\n", strerror (errno)); |
74 | } |
75 | } |
75 | |
76 | |
76 | { |
77 | { |
|
|
78 | int val; |
|
|
79 | |
|
|
80 | #ifdef IP_TOS |
77 | int val = IPTOS_LOWDELAY; |
81 | val = IPTOS_LOWDELAY; |
78 | |
|
|
79 | if (setsockopt (fd, IPPROTO_IP, IP_TOS, &val, sizeof (val))) |
82 | if (setsockopt (fd, IPPROTO_IP, IP_TOS, &val, sizeof (val))) |
80 | LOG (llevError, "IP_TOS: %s\n", strerror (errno)); |
83 | LOG (llevError, "IP_TOS: %s\n", strerror (errno)); |
81 | } |
84 | #endif |
82 | |
85 | |
83 | { |
86 | #ifdef TCP_NODELAY |
84 | int val = 1; |
87 | val = 1; |
85 | |
|
|
86 | if (setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, &val, sizeof (val))) |
88 | if (setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, &val, sizeof (val))) |
87 | LOG (llevError, "TCP_NODELAY: %s\n", strerror (errno)); |
89 | LOG (llevError, "TCP_NODELAY: %s\n", strerror (errno)); |
|
|
90 | #endif |
|
|
91 | |
|
|
92 | // set some very aggressive keepalive parameters |
|
|
93 | #ifdef TCP_KEEPIDLE |
|
|
94 | val = 1; |
|
|
95 | if (setsockopt (fd, IPPROTO_TCP, TCP_KEEPIDLE, &val, sizeof (val))) |
|
|
96 | LOG (llevError, "TCP_KEEPIDLE: %s\n", strerror (errno)); |
|
|
97 | #endif |
|
|
98 | |
|
|
99 | #ifdef TCP_KEEPCNT |
|
|
100 | val = 3; |
|
|
101 | if (setsockopt (fd, IPPROTO_TCP, TCP_KEEPCNT, &val, sizeof (val))) |
|
|
102 | LOG (llevError, "TCP_KEEPCNT: %s\n", strerror (errno)); |
|
|
103 | #endif |
|
|
104 | |
|
|
105 | #ifdef TCP_KEEPINTVL |
|
|
106 | val = 1; |
|
|
107 | if (setsockopt (fd, IPPROTO_TCP, TCP_KEEPINTVL, &val, sizeof (val))) |
|
|
108 | LOG (llevError, "TCP_KEEPINTVL: %s\n", strerror (errno)); |
|
|
109 | #endif |
|
|
110 | |
|
|
111 | // try to find the mss value in use |
|
|
112 | #ifdef TCP_MAXSEG |
|
|
113 | socklen_t sl = sizeof (val); |
|
|
114 | if (!getsockopt (fd, IPPROTO_TCP, TCP_MAXSEG, &val, &sl) && sl == sizeof (val)) |
|
|
115 | mss = val; |
|
|
116 | #endif |
88 | } |
117 | } |
89 | |
|
|
90 | #ifdef __linux__ |
|
|
91 | { |
|
|
92 | int val; |
|
|
93 | |
|
|
94 | // set some very aggressive keepalive parameters |
|
|
95 | val = 10; |
|
|
96 | if (setsockopt (fd, IPPROTO_TCP, TCP_KEEPIDLE, &val, sizeof (val))) |
|
|
97 | LOG (llevError, "TCP_KEEPIDLE: %s\n", strerror (errno)); |
|
|
98 | |
|
|
99 | val = 5; |
|
|
100 | if (setsockopt (fd, IPPROTO_TCP, TCP_KEEPCNT, &val, sizeof (val))) |
|
|
101 | LOG (llevError, "TCP_KEEPCNT: %s\n", strerror (errno)); |
|
|
102 | |
|
|
103 | val = 1; |
|
|
104 | if (setsockopt (fd, IPPROTO_TCP, TCP_KEEPINTVL, &val, sizeof (val))) |
|
|
105 | LOG (llevError, "TCP_KEEPINTVL: %s\n", strerror (errno)); |
|
|
106 | } |
|
|
107 | #endif |
|
|
108 | |
118 | |
109 | { |
119 | { |
110 | int bufsize = 65535; /*Supposed absolute upper limit */ |
120 | int bufsize = 65535; /*Supposed absolute upper limit */ |
111 | int oldbufsize; |
121 | int oldbufsize; |
112 | int buflen = sizeof (int); |
122 | int buflen = sizeof (int); |