2008-10-01 99 views
3

我有一個.NET TCP客戶端,它將大量消息發送到(.NET異步)TCP服務器。大容量TCP客戶端的設計

我需要不斷髮送消息到服務器,但由於TIME_WAIT,我用完了客戶端的端口。

程序如何在不使用所有可用端口的情況下連續可靠地發送消息?

有沒有一種方法來保持重用相同的套接字。我看過Disconnect()和REUSEADDRESS套接字標誌,但找不到任何使用它們的好例子。實際上,大多數消息來源表示不使用斷開連接,因爲它是用於較低級別的使用(即,它僅回收套筒手柄)。

我在想我需要切換到UDP或者也許有使用C++和IOCP的方法?

回答

1

您的客戶端是否可以保持相同的套接字打開並在循環中發送消息?

open socket connection 

while(running) 
    send messages over socket 

close socket connection 
0

當這樣編碼它不起作用。

服務器只收到第一條消息。

當我打開和關閉套接字,然後服務器工作,但我用盡客戶端端口。

我猜這是我的服務器的設計,導致我必須編寫這樣的客戶端。

那麼,如何編碼一個使用.NET的異步服務器。我在網上關注了MSDN的例子和衆多例子。

0

沿着消息排隊服務的方向會讓你的項目受益嗎?這樣你的客戶端就可以將盡可能多的消息傳遞給你的服務器,並且你的服務器可以簡單地從隊列中提取這些消息,並且儘可能快地發送消息,並且如果你的客戶端發送的消息超過了它的處理能力,進入隊列並等待處理。

一些快速谷歌搜索出現了這MSDN documentation on building a message queuing service with C#

0

編寫TCP服務器(使用任何語言)背後的基本思想是打開一個端口來偵聽連接,然後創建新線程或進程來處理新的連接請求。

open a server socket // this uses the port the clients know about 

while(running) 
    client_socket = server_socket.listen 
    fork(new handler_object(client_socket)) 

這裏的a good example in C#

+0

這個比例是不是很嚴重?假設你有1000個連接。你是否建議應該有1000個線程? – Arafangion 2010-10-14 04:48:27

5

如果您的服務器和客戶端知道數據的格式,則可以保持該套接字處於打開狀態。您正在關閉套接字,以便服務器可以「看到」客戶端已「完成」。

如果你有一些協議,那麼服務器可以「知道」什麼時候接收完一塊數據。

您可以查找某種類型的消息結束標記,您可以傳遞消息的長度,並根據大小等來讀取其餘的消息。執行此操作的方式不同。

但是沒有理由不斷打開和關閉服務器的連接 - 這就是你在這裏遇到的問題。

1

TCP非常努力地防止網絡擁塞。所有新的TCP連接都以「慢啓動」狀態開始,它們只發送一個數據包並等待來自另一端的確認。如果收到ACK,則TCP將發送兩個數據包,然後發送四個數據包,直到達到其最大窗口大小。

如果您以高數據速率生成郵件,您確實希望避免打開和關閉TCP連接。每當你建立一個新的連接,你都會慢慢開始。如果您可以保持套接字打開,則TCP連接將超過緩慢啓動狀態,並且能夠以更高的速率發送數據。

爲此,您需要讓服務器在連接上處理多條消息(這意味着要找出描述每條消息的方法)。如果你的服務器支持任何類型的HTTP編碼,這將工作;確保檢查與「持久性」連接或HTTP 1.1相關的任何參數或配置,因爲這是HTTP通過單個TCP連接發送多個請求的方式。

你提到的一個選項是UDP。如果您以相當高的速度生成消息,則由於隊列在某處處於滿位狀態,您可能會丟失部分消息。如果你發送的消息需要可靠,UDP可能不是一個好的基礎。