fd
がソケット ファイル記述子の場合、これらのシステム コールは同じです。
send(fd, data, length, 0)
と同じですwrite(fd, data, length)
recv(fd, data, length, 0)
と同じですread(fd, data, length)
flags
したがって、ゼロ以外のパラメーターを設定する必要がない限り、send/recv
またはを使用しても違いはありませんwrite/read
。
sendfile
システムコールは最適化です。ソケットsockfd
と通常のファイルfilefd
があり、いくつかのファイル データをソケットにコピーする場合 (たとえば、ファイルを提供する Web サーバーの場合)、次のように記述できます。
// Error checking omitted for expository purposes
while(not done)
{
char buffer[BUFSIZE];
int n = read(filefd, buffer, BUFSIZE);
send(sockfd, buffer, n, 0);
}
ただし、これは非効率的です。これには、カーネルがファイル データを (read
呼び出しで) ユーザー空間にコピーしてから、同じデータを (send
呼び出しで) カーネル空間にコピーし直す必要があります。
システム コールを使用するsendfile
と、そのコピーをすべてスキップし、カーネルにファイル データを直接読み取らせて、ソケットに送信させることができます。
sendfile(sockfd, filefd, NULL, BUFSIZE);