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 次 |
| 最近记录: |