我正在考虑通过TCP套接字发送视频文件的最佳方法。我已经制作了一个标准的套接字程序,但在read
命令之后,我不知道如何保存它。
代码示例
//bind server socketfd
if (bind(sfdServer, (struct sockaddr*)&adrServer, ServerAddrLen) < 0)
error("ERROR binding");
listen(sfdServer, 5);
while(1){
printf("Waiting for connections...\n");
sfdClient = accept(sfdServer, (struct sockaddr*)&adrClient, &ClientAddrLen);
if(sfdClient < 0)
error("ERROR accepting");
printf("Connection Established.\n");
//set buffer to zero
bzero(buff, 2048);
printf("Reading from client.\n");
numChar = read(sfdClient, buff, 2048);
//What should go here?
close(sfdClient);
close(sfdServer);
}
我只是将缓冲区保存为文件 movie.mp4 或类似的东西吗?我意识到我可能需要更改缓冲区大小或者可能需要以块的形式发送它。但我找不到有关最佳方法的任何好信息。任何帮助或正确方向的观点都将不胜感激!
答案 0 :(得分:3)
您将缓冲区块写入文件。
首先,打开一个输出文件进行编写:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int outfd;
outfd = open("movie.mp4", O_WRONLY|);
然后,在read()
之后,写下你的字节:
numWrite = write(outfd, buff, numChar);
请注意,您需要处理许多分块/缓冲情况,例如:
read()
或write()
返回零或-1(错误)write()
写入的字节数少于请求的数量(这可能发生在网络文件系统上)答案 1 :(得分:2)
首先,您应该考虑使用sendfile()
或等效系统。也就是说,不是将文件块读入内存而只是将其写回某处,而是应该对文件描述符进行内存映射并一次性发送所有内容。
对于分块,TCP会负责将流拆分为数据包。理想情况下,远程节点应该确切地知道预计会有多少预期,以便它可以处理预先成熟的终止(这就是HTTP头包含内容长度的原因)。
因此在发送数据之前使用某种握手。然后,发件人应该在循环中调用sendfile()
,注意发送的数据量和返回的offet
。接收方应在循环中调用recv()
以确保它们全部到达(没有标准的“recvfile()
”)。