accept4()は無い
accept4() システムコールは Linux 2.6.28 以降で利用可能である。 glibc でのサポートはバージョン 2.10 以降で利用可能である。
http://www.linux.or.jp/JM/html/LDP_man-pages/man2/accept.2.html
TCP_NODELAY
Nagleアルゴリズムを無効にする。
#include <sys/types.h> #include <sys/socket.h> int flag = 1; result = setsockopt(sd, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof(flag)); if( result<0 ) perror("setsockopt");
IPPROTO_TCPはIPv6でもそのまま使っていいっぽいけど、念のためstruct addrinfo *ai;のai->ai_protocolを使っとけば安心。
Nagleアルゴリズム
送信してACKが返ってくる前にさらに何か送信しようとしたとき、まとめて送信しようとする機能。
この機能が有効になってても最初の一発目は普通に即送信する。二発目以降は、次の条件を満たすまでデータをためこむ:
- ACKが返ってきた
- データの大きさがTCPパケットのデータ最大長(MSS)になった
- 一定時間(200ミリ秒くらい?)経った
つまり、会話的なプロトコルの場合、これの設定はまったくどうでもいい。
参考:
O_CLOEXEC
forkしたら子プロセス側で勝手にcloseさせる機能。closeしてまわらなくていいので便利。
#include <unistd.h> #include <fcntl.h> int flag; flag=fcntl(sd,F_GETFD); if(flag>=0)fcntl(sd,F_SETFD,flag|FD_CLOEXEC);
O_NONBLOCK
いわゆるノンブロック
int flag; flag=fcntl(sd,F_GETFL); if(flag>=0)fcntl(sd,F_SETFL,flag|O_NONBLOCK);