[英]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.