相关疑难解决方法(0)

如何使用sendfile接收文件?

使用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)

似乎有两种方法可以做到这一点:

  1. 首先发送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)
  2. 在接收端使用循环:

    //receive end
    while(sendfile(fd,sockfd,&offset,BUF_LEN) > 0) {
        offset += BUF_LEN;
    }
    
    Run Code Online (Sandbox Code Playgroud)

哪一个更好?我应该专门处理缓冲区长度吗?文件很大时,第一种方法是否有问题?

(我真的很喜欢sendfile的mac os版本,如果count为0,它将一直发送到文件末尾)

c sockets linux

5
推荐指数
1
解决办法
3930
查看次数

winsock不支持读/写

一个小的测试程序(使用MinGW在Linux上编译),我注意到一个不能使用read,并write为使用的Winsock2的实施获得呼吁套接字fd socket调用.写调用返回<0并设置errno = EBADF.

想想从xinetd运行的程序,减去他们的stdin/stdout始终是套接字的假设.(例如,某些程序会调用getpeername,如果它不是套接字,则会失败,随后它们可能会过早退出.)

那么,除了对fd进行假设之外,如何在/ windin/stdout中读取/写入的{文件描述符类型} - 不可知程序应该合理地在win32环境中工作?

或者更简单地说,是否有一些魔术函数调用被执行以连接Winsock2套接字fds与win32(井,mingw)write实现?

c winsock

3
推荐指数
2
解决办法
6130
查看次数

标签 统计

c ×2

linux ×1

sockets ×1

winsock ×1