[英]Best way to send video over TCP Socket in C
我正在尝试考虑通过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或类似文件吗? 我意识到我可能需要更改缓冲区大小或可能将其分块发送。 但是我找不到最佳的方法来获得最佳信息。 任何帮助或朝着正确方向的观点将不胜感激!
您需要将缓冲区块写入文件。
首先,打开一个输出文件以进行写入:
#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()
写入的字节数少于请求的字节数(这可能在网络文件系统上发生) 首先,您应该考虑对系统使用sendfile()
或等效文件。 也就是说,与其将文件的一部分读取到内存中而不是将其写回到某个位置,您应该对文件描述符进行内存映射并一次性发送所有内容。
至于分块,TCP会负责为您将流拆分为数据包。 理想情况下,远程节点应该确切知道期望多少,以便它可以处理提前终止(这就是HTTP标头包含内容长度的原因)。
因此,在发送数据之前请使用某种握手方式。 然后,发送方应该只循环调用sendfile()
,注意发送的数据量和返回的offet
。 接收者应该在循环中调用recv()
以确保所有内容都到达了(没有标准的“ recvfile()
”)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.