2011-01-31 35 views
5

我試圖想有送過來一個TCP套接字的視頻文件的最好方法。我製作了一個標準套接字程序,但在read命令之後,我不知道如何才能保存它。最佳的方式發送視頻通過TCP套接字用C

代碼示例

//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或類似的東西?我意識到我可能需要更改我的緩衝區大小或可能將它發送成塊。但我無法找到任何有關如何做到這一點的最佳方法。任何幫助或正確的方向點將不勝感激!

回答

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(錯誤)
  • 讀取直到沒有更多字節可用。現在,您的代碼只能讀取2048個字節,然後關閉套接字。
  • write()比寫請求(這可能發生在網絡文件系統)
+0

好的使用這個信息我能夠得到一切整理出來。到目前爲止,我可以將文本從java客戶端傳輸到此C服務器。但是,就像你有它,我假設只要我從客戶端接收數據時正確地轉儲緩衝區,它應該以同樣的方式傳輸視頻文件? – 2011-02-03 23:20:19

+1

如果我正確理解你的問題,那麼是的:對於你收到的每個緩衝區(例如2048或更少的字節),如果你將它寫出到你的文件中,直到你沒有收到更多的字節,它應該都可以工作。網絡連接和套接字不關心它是文本還是二進制文件。 – payne 2011-02-06 02:58:02

2

首先,你應該考慮使用sendfile()或者類似的系統較少的字節。也就是說,不是將文件的一部分讀入內存,而是將其寫回到某個地方,您應該記憶映射文件描述符並一次發送所有內容。

至於分塊,TCP採用流分成爲你包的護理。理想情況下,遠程節點應該確切地知道預計會有多少,所以它可以處理預先成熟的終止(這是HTTP頭包含內容長度的原因)。

發送數據之前,所以使用某種握手。然後發件人應該在循環中調用sendfile(),注意發送的數據量和返回的offet。接收機應在迴路中呼叫recv()以確保它全部到達(沒有標準的「recvfile()」)。

相關問題