listenのバックログが指定できない - 揮発性のメモの続き
http://www.linux.or.jp/JM/html/LDP_man-pages/man2/listen.2.html
int listen(int sockfd, int backlog);
backlogでバックログの数=accept()待ちの接続のキューの数を指定できる。
ということになっているけど、実際はキューの数をあまり制限できないっぽい。
カーネル側の設定を
# cat /proc/sys/net/ipv4/tcp_syncookies 0 # cat /proc/sys/net/ipv4/tcp_max_syn_backlog 1
プログラム側を
result = listen( sd, 1 );
として制限かけていても、実際にはセッションが確立してしまう。
tcp 0 0 172.16.1.4:5000 172.16.101.10:4895 SYN_RECV - tcp 0 0 172.16.1.4:5000 172.16.101.10:4894 SYN_RECV - tcp6 0 0 172.16.1.4:5000 172.16.101.10:4893 ESTABLISHED 2890/testserver tcp6 0 0 172.16.1.4:5000 172.16.0.82:38941 ESTABLISHED - tcp6 0 0 172.16.1.4:5000 172.16.0.82:38940 ESTABLISHED -
ESTABLISHED状態のキューの最大数が listen(sd,backlog)のbacklog +1となり、
SYN_RECV状態のキューの最大数が tcp_max_syn_backlog +1となる模様。
それ以上の接続は受け付けなくなる。
(SYN_RECV状態のキューはそのうち切断される)
どれも、接続が確立したことになってるのでsend()したデータがサーバまできちんと送信される。
サーバがaccept()するより先にクライアントが切断していても、サーバまできちんと送信される。
現象はわかったけど原理はわからないので、あとでソース読む。