2013-06-13 158 views
0

我有一臺服務器聯繫另一臺服務器,用於檢索客戶端請求的文件。字節到與TCP套接字發送的字節

請求過程是:

Client ----> Server A ----> Server B 

發送文件的過程:

Server B ---> server A ----> client 

我不能直接將客戶端連接到服務器B.

這是要求:

服務器A必須在客戶端到達另一個客戶端時轉發到客戶端文件數據服務器(無需等待整個文件的接收)。所以字節到字節到達。

其他信息:

TCP socket; 

Programming in C on Linux. 

可能有人請給我一些想法來實現這一點?

更新

這是我第一次嘗試。

/* This code is refered to SERVER A */ 
/* s is the file descriptor for comunicate with SERVER B */ 
/* t is the file descriptor for comunicate with CLIENT */ 

int forward (int s, int t, char *buffer, size_t bytes){ 

    size_t n; 
    ssize_t nread; 
    ssize_t nsend; 
    char c; 

    for (n=1; n<bytes; n++) 
    { 
     nread=recv(s, &c, 1, 0); 
     if (nread == 1) 
     { 
      nsend = send(t,c,1,0); 
      if (nsend<=0) { 
       return (-1); 
      } 
     } 
     else if (nread == 0) 
     { 
      return (n-1); /* Errore */ 
     } 
     else 
      return (-1); /* Errore */ 
    } 
    return (n); 
} 
+0

首先試一下,這不是一個好問題。您需要使用多線程/處理C程序來爲更多的客戶端提供服務,並同時在服務器A上偵聽並下載/上傳。在服務器B上,您需要偵聽來自服務器A的請求,然後發送數據B。馬上重傳數據。如果你需要更多的定製,使用UDP,而不是TCP。 – bartimar

+0

但是,您可以在B上安裝B磁盤並讓samba來處理這個問題嗎? – bartimar

+1

您正在描述一個[netcat](http://en.wikipedia.org/wiki/Netcat)管道 –

回答

1

*所有服務器B首先應該在端口80用於HTTP連接收聽(我們可以在這裏使用XAMPP創建服務器)。

服務器A(充當代理服務器)應該在特定的端口上監聽tcp連接,只要它從該端口處的客戶端獲得任何請求。首先連接到客戶端,然後將請求傳送到服務器B在dst-port 80通過建立一個tcp連接並等待來自服務器B的回覆。

當服務器B收到請求時,它將數據轉發到服務器A,然後服務器A轉發到客戶端。

對於製作一個tcp連接你可以參考beej guide的socket編程。這裏給出一個簡單的實現。 和一次有多個連接,你可以使用Pthreads創建線程,也可以使用fork()系統調用創建進程。*

+0

我希望你會編輯更多......爲什麼B要在80上聽呢?這是無稽之談...... – bartimar

+0

我們可以在B上運行任何服務器,使用xampp或其他一些其他的東西,在這裏我們不需要任何類型的編程,只需要安裝xampp即可。 – KJS

+0

服務器A的一個非常簡單的JAVA實現在該鏈接中給出。 http://examples.oreilly.com/jenut/SimpleProxyServer.java – KJS

0

你應該儘可能地在每一個操作中嘗試讀取它更快。另外請注意,send()可能無法像您收到的那樣發送,因此您必須循環執行send()操作,直到沒有任何事件發生。

請注意,這是我用C編寫了一個很長的時間前,所以你可能有如果你運行一個專門的線程,你可以直接跳過向前方法來改變變量類型等

int forward (int s, int t, char *buffer, size_t bytes){ 

    size_t index; 
    ssize_t bytesSent; 
    ssize_t bytesToSend; 
    ssize_t 

    while (true) { 
    { 
     bytesToSend = recv(s, buffer, bytes, 0); 
     if (bytesToSend <= 0) { 
      return bytesToSend; 
     } 

     index = 0; 
     while (bytesToSend > 0) { 
      bytesSent = send(t, (buffer + index), bytesToSend, 0); 
      if (bytesSent <= 0) { 
       return bytesSent; 
      } 
      bytesToSend -= bytesSent; 
      index += bytesSent 
     } 

    } 

    return 1; 
} 

bytesToRead檢查外while,只使用while (1)

+0

如果通信速度慢(太多客戶端正在下載)並且'B'只發送一些數據,然後等待併發送另一個數據(可能是' bytes ==緩衝區大小或更小)...'A'可以在recv超時返回-1,並且轉發被破壞。所以當很多客戶連接時,你總是可以超時並且不會轉發任何東西。可以在另一個點(接收客戶端數量)解決,但不要忘記,當recv返回-1時,它可能超時。 – bartimar

+0

爲真。它應該返回1(成功),0(斷開)或-1(超時) – jgauffin