2011-02-11 32 views
0

讓我先告訴我想要做什麼。 我想寫一個非常簡單的代理服務器。 我使用套接字API來創建套接字。 socket = socket(AF_INET, SOCK_STREAM, 0));如何使用C中的套接字讀取流的TCP數據包?

我的代理服務器工作正常,直到我嘗試了流數據。 所以我做的是我的服務器套接字監聽請求並解析它們,然後將它們轉發給實際的服務器,然後我使用read()調用來讀取數據包&我將其盲目地轉發回客戶端。

對於所有的html頁面和圖片,它工作正常。但是當我嘗試轉發流式視頻時,我無法做到這一點。

我的套接字始終返回應用層數據(HTTP數據包),但在流視頻中,只有第一個數據包是http,剩下的全部只是TCP數據包。所以我只能轉發第一個HTTP數據包。當我嘗試讀取包含數據的其他數據包(全部是TCP)時,我在應用層沒有得到任何東西(這很明顯,因爲這些數據包中的應用層沒有任何東西)。所以我卡住了,我不知道如何從TCP層讀取這些數據包(我不想使用原始套接字)並完成我的工作。

在此先感謝

回答

0

如果您使用socket API,那麼你是在HTTP層上,也就是你的一切「只是TCP」。如果連接被卡住了,最有可能的是別的東西壞了。請注意,不能保證HTTP請求或回覆頭甚至可以放入單個數據包;他們通常會這樣做。

符合HTTP 1.1規範的流媒體服務器將使用「Content-Encoding:chunked」並報告每個塊的長度而不是整個文件的長度,在代理時請記住這一點。

+0

感謝您的回覆。我同意你的看法,但是你不認爲我應該能夠讀取數據流的TCP數據包中的數據,因爲我可以使用HTML頁面或數據流的所有其他數據包。 – Durin

+0

絕對。我現在懷疑的是,爲了將所有數據讀入大緩衝區,您只需調用read()函數一次,然後一次處理所有數據,您應該在其中執行小讀取操作並在其間執行處理。 –

0

所以我所做的就是我的服務器套接字 聽取了請求,並解析 他們

爲什麼?除了請求的第一行之外,HTTP代理不必分析任何內容,知道在哪裏建立上游連接。其他一切只是在兩個方向上覆制字節。

+0

亞這就是我做的! – Durin