揮発性のメモ2

http://d.hatena.ne.jp/iww/

ネットワークの勉強

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_TCPIPv6でもそのまま使っていいっぽいけど、念のため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);