2010-12-06 112 views
0

我正在編寫一個服務器端客戶端編程在C中使用套接字API,我試圖發送控制信息到客戶端使用不同的TCP連接。 每當服務器創建新的套接字(TCP)時,我都希望它通知客戶端使用新的套接字進行進一步的通信。目前我曾想過發送UDP數據包給客戶端以通知。一旦客戶端收到數據包,就會將ACK發送回服務器,同時切換到另一個TCP連接。 我想知道,除了使用UDP之外,還有更好的方式來通過網絡傳輸控制數據,因爲它是不可靠的.Thnx傳遞在客戶端服務器之間的套接字編程客戶端服務器C

我想闡述一下我試圖實現的目標。我將測量帶寬,延遲,接收窗口等參數作爲Ipv4和IPv6 TCP連接的度量標準。基於觀察到的性能,我將在提供更好性能的兩個協議之間切換。一旦決定切換,我必須通知合作伙伴(可能是基於我正在測量的上傳,下載的帶寬類型的客戶端或服務器) 。我從IPv4連接開始,同時打開另一個連接 - 測量帶寬和延遲的IPv6。

如果IPv6連接提供更好的性能,我需要告訴客戶端切換到IPv6。在這種情況下,兩個連接都打開以便週期性地監視帶寬以決定切換。所以我在這方面有兩個疑問。 1.一次保持兩個連接是一個好主意。只有當我需要測量度量時,我才能創建另一個連接,因爲兩臺機器之間的路徑幾乎不會改變。如果是,我可以使用控制信息另一個TCP連接告訴客戶端進行切換。這樣我也可以測量帶寬並通知客戶端

兩個有兩個TCP連接是不是一個好主意,我可以用UDP發送控制信息。我正在避免發送用於傳輸實際數據的conn的控制信息,因爲這將是一個開銷。我的代碼將像中間件一樣傳輸數據,其中應用程序將調用我的函數/宏來傳輸數據,而內部代碼將負責測量帶寬和切換的決定。我希望我明白我的要實現。提前感謝您的反饋

+1

服務器在切換之前如何與客戶端進行通信?他們是否已經有一個現有的TCP連接?也許你應該更多地解釋架構 - 這個問題留下了很多想象。 如果你已經有了一個開放的TCP連接,你可以使用它進行通信。如果你正在和一個你以前沒有見過的新客戶交談過,UDP可能會工作,但是爲了應對不可靠性,考慮等待ACK,如果沒有在幾秒鐘內收到,重新發送它。 – mgiuca 2010-12-06 03:16:18

+1

聽起來像重新實現FTP協議? – 2010-12-06 03:45:58

回答

1

爲服務器端監聽TCP套接字操作的正常順序是:

int fd1 = socket(...); // Create socket - assuming TCP, not UDP 
bind(fd1, ...);   // Bind it to a local address 
listen(fd1, ...);  // Set it in listen mode 

int fd2; 

while ((fd2 = accept(fd1, ...)) != -1) // Accept an incoming connection 
{ 
    ...communicate with client via fd2... 
    close(fd2);   // When finished 
} 

close(fd1); 

現在,當你fd2點,具有插座具有不同從端口fd1連接到(根據EJP更正)的端口的本地臨時端口。沒有必要將任何特定信息傳回給客戶; TCP/IP實現爲您處理。客戶端將有一個連接到fd2的套接字,其連接到服務器的端口(可能是短暫端口)和服務器的臨時端口。

重點是完成的連接將有一個唯一的4元組(客戶端IP地址,客戶端端口,服務器IP地址,服務器端口)。

說到處理,有很多種處理方法。在處理任何其他請求之前,您可以使用迭代服務器處理一個請求。或者你可以用兩種不同的方式創建一個併發服務器。一種方法是使用線程服務器,其中線程(來自池,或爲每個傳入連接新創建)處理新請求,同時主線程返回接受新傳入請求。另一種方法是創建一個分叉服務器,其中主服務器進程分叉和子進程處理新連接,而父進程關閉連接並返回監聽下一個連接請求。