簡體   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