使用sendfile发送文件很容易:
stat(fd,&filestat);
sendfile(sockfd,fd,0,filestat.len)
Run Code Online (Sandbox Code Playgroud)
但是如何使用sendfile接收文件?由于我不知道文件的长度,我应该先发送文件的长度吗?
sendfile(fd, sockfd,0, ??)
Run Code Online (Sandbox Code Playgroud)
似乎有两种方法可以做到这一点:
首先发送filestat.len
//send end
write(sockfd,filestat.len);
sendfile(sockfd,fd,&offset,filestat.len);
//receive end
read(sockfd,&len);
sendfile(fd,sockfd,&offset,len)
Run Code Online (Sandbox Code Playgroud)在接收端使用循环:
//receive end
while(sendfile(fd,sockfd,&offset,BUF_LEN) > 0) {
offset += BUF_LEN;
}
Run Code Online (Sandbox Code Playgroud)哪一个更好?我应该专门处理缓冲区长度吗?文件很大时,第一种方法是否有问题?
(我真的很喜欢sendfile的mac os版本,如果count为0,它将一直发送到文件末尾)
一个小的测试程序(使用MinGW在Linux上编译),我注意到一个不能使用read,并write为使用的Winsock2的实施获得呼吁套接字fd socket调用.写调用返回<0并设置errno = EBADF.
想想从xinetd运行的程序,减去他们的stdin/stdout始终是套接字的假设.(例如,某些程序会调用getpeername,如果它不是套接字,则会失败,随后它们可能会过早退出.)
那么,除了对fd进行假设之外,如何在/ windin/stdout中读取/写入的{文件描述符类型} - 不可知程序应该合理地在win32环境中工作?
或者更简单地说,是否有一些魔术函数调用被执行以连接Winsock2套接字fds与win32(井,mingw)write实现?