簡體   English   中英

在C中的套接字編程中在客戶端-服務器之間傳遞控制信息

[英]Passing control information between client-server in socket programming in C

我正在使用套接字API在C中為服務器-客戶端編程進行編碼,在該示例中,我試圖將控制信息發送給客戶端以使用不同的TCP連接。 每當服務器創建新的套接字(TCP)時,我都希望它通知客戶端使用新的套接字進行進一步的通信。目前,我已經考慮過向客戶端發送UDP數據包以進行通知。 客戶端收到數據包后,它將ACK發送回服務器,同時切換到另一個TCP連接。 我想知道,除了使用UDP之外,還有一種更好的方法可以通過網絡在網絡上通信控制數據。

我想詳細說明我要達到的目標。 我將測量諸如帶寬,等待時間,接收窗口等參數,作為Ipv4和IPv6 TCP連接的度量。 根據觀察到的性能,我將在提供更好性能的兩個協議之間進行切換。一旦做出切換決定,我必須通知合作伙伴(可能是客戶端或服務器,基於我正在測量上載,下載的帶寬類型) 。 我從IPv4連接開始,同時打開另一個連接-IPv6,用於測量帶寬和延遲。

如果IPv6連接提供更好的性能,則需要告訴客戶端切換到IPv6。 在這種情況下,兩個連接都是開放的,用於定期監視帶寬以決定切換。 因此,我對此有兩個疑問。 1,一次保持兩個連接是一個好主意,只有在需要測量指標時才可以創建另一個連接,因為兩台機器之間的路徑幾乎不變,如果可以,我可以使用另一個TCP連接告訴客戶端進行切換。 這樣我也可以測量帶寬並通知客戶端

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

服務器端偵聽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地址,服務器端口)。

當涉及到處理時,有多種處理方法。 您可以使用迭代服務器來處理一個請求,然后再處理其他請求。 或者,您可以通過兩種不同方式之一創建並發服務器。 一種方法是使用線程服務器,其中線程(來自池,或為每個傳入連接新創建)處理新請求,而主線程返回以接受新傳入請求。 替代方法是創建一個派生服務器,其中主服務器進程進行分叉,子進程處理新連接,而父進程關閉該連接並返回偵聽下一個連接請求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM