繁体   English   中英

在C中通过TCP套接字发送视频的最佳方法

[英]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(错误)
  • 读取直到没有更多字节可用为止。 现在,您的代码仅读取2048个字节,然后关闭套接字。
  • write()写入的字节数少于请求的字节数(这可能在网络文件系统上发生)

首先,您应该考虑对系统使用sendfile()或等效文件。 也就是说,与其将文件的一部分读取到内存中而不是将其写回到某个位置,您应该对文件描述符进行内存映射并一次性发送所有内容。

至于分块,TCP会负责为您将流拆分为数据包。 理想情况下,远程节点应该确切知道期望多少,以便它可以处理提前终止(这就是HTTP标头包含内容长度的原因)。

因此,在发送数据之前请使用某种握手方式。 然后,发送方应该只循环调用sendfile() ,注意发送的数据量和返回的offet 接收者应该在循环中调用recv()以确保所有内容都到达了(没有标准的“ recvfile() ”)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM