Ada*_*eld 33
如果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);
}
Run Code Online (Sandbox Code Playgroud)
但是,这是低效的:这涉及内核将文件数据复制到用户空间(在read
调用中),然后将相同的数据复制回内核空间(在send
调用中).
该sendfile
系统调用让我们跳过所有的复制和有内核直接读取文件数据,并一举将其发送插槽上:
sendfile(sockfd, filefd, NULL, BUFSIZE);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
18331 次 |
最近记录: |