2011-02-16 17 views
0

我的問題是當你有一個代理服務器,你需要發送/ recv與客戶端,併發送/ recv與遠程服務器你怎麼知道在那裏結束是要發送/ recv的數據,所以我可以調用相應的函數。 我需要recv /從一個網站發送字節到客戶端(通過代理)和從客戶端到服務器(通過代理),但我不知道他們以什麼順序來,我看到這是不同的大多數網站。
我目前的實施過程是這樣:如何知道什麼時候從客戶端服務器發送/ recv字節C++

1) receive from client 
2) send to server 
//infinite loop here 
3) receive from server 
4) send to client 
// until bytes from server is 0 

這只是工作的幾個網站,並沒有完全加載它們,只有15-20 KB。
有什麼建議嗎?

回答

1

您的任務將從客戶端轉發數據到服務器並返回。由於客戶端和服務器可以同時傳輸數據,因此當您從客戶端讀取所有內容時,都會將其傳遞到服務器,反之亦然無效:考慮您在等待客戶端開始傳輸時的情況,客戶端在啓動服務器之前需要從服務器接收數據自己的傳輸。
因此,有以下幾種方式,使其工作:

  1. 建設兩個明確的管道 - 一個從客戶端到服務器,另一個從服務器到客戶端。這將需要4個線程 - 一個從客戶端讀取數據並將數據傳遞給其他服務器寫入,反之亦然。這具有每個客戶端有4個線程的缺點,這限制了您的代理可以支持的併發客戶端的數量。
  2. 僱用select(2)功能(或來自Windows API的類似sys調用)+非阻塞套接字。這會告訴你什麼時候有數據要被讀取或寫入。如果您想爲每個線程提供多個客戶端,則需要使用非阻塞套接字,因此線程不會在讀/寫系統調用中被阻塞。
    在手冊頁中有select樣本和大量的互聯網信息。

致力於服務器開發的一個着名頁面是here

+0

非常感謝 – Kobe 2011-02-16 17:40:20

0

從客戶 接收發送到服務器 而(真) { 如果(recvfrom的服務器不是零) 發送到客戶端 如果(recvfrom的客戶端不是零) 發送到服務器 }

我認爲這可能工作..

0

使用select()等待數據從任何一方都可用,然後閱讀並傳遞它。

相關問題