ネットワークインタフェース

非ブロックソケット

一部のアプリケーションは、ブロックしないソケットを必要とします。たとえば、すぐに完了できず (完了を待っている間に) プロセスを一時的に中断させてしまう要求は実行されません。エラーコードが返されます。ソケットが作成され、別のソケットに対する接続が確立されたあと、例 2-13 に示すように fcntl(2) 呼び出しを発行してこのソケットを非ブロックに設定できます。


例 2-13 非ブロックソケットの設定

#include <fcntl.h>
#include <sys/file.h>
...
int fileflags;
int s;
...
s = socket(AF_INET6, SOCK_STREAM, 0);
...
if (fileflags = fcntl(s, F_GETFL, 0) == -1)
		perror("fcntl F_GETFL");
		exit(1);
}
if (fcntl(s, F_SETFL, fileflags | FNDELAY) == -1)
		perror("fcntl F_SETFL, FNDELAY");
		exit(1);
}
...

非ブロックソケットで入出力を行う場合は、オペレーションが正常にブロックする場合に発生する、errno.h 内のエラー EWOULDBLOCK をチェックしてください。accept(3SOCKET)connect(3SOCKET)send(3SOCKET)recv(3SOCKET)read(2)、および write(2) はすべて、EWOULDBLOCK を返すことができます。send(3SOCKET) のようなオペレーションを完全には実行できないが、ストリームソケットを使用する場合などに部分的な書き込みは可能という場合には、すぐに送信できるデータは処理され、実際に送信された量が関数の戻り値となります。