2009-11-02 18 views
0

我正在使用Ruby來測試使用套接字的C#網絡應用程序。我打開與@socket = TCPSocket.new(IP,PORT)的連接,它的工作原理 - 直到我想發送的文本超過1024個字符。然後Ruby將消息分成兩部分。 C++和C#將消息作爲一個包發送,因此C#應用程序不需要加入這些部分。使用Ruby指定數據包大小TCPSocket

消息永遠不會超過約。 2000字符。是否有可能爲TCPSocket設置數據包大小?

編輯: 你的答案是正確的,但所以這裏閱讀了大量的紅寶石插座的問題後,我找到了解決辦法:

socket.send(msg,0x4) 

不會拆分消息。直接發送的選項有所不同。

我不知道這是否可以通過互聯網工作,但它在我的測試實驗室工作。

Thx尋求幫助。

+3

你不應該使用TCP的數據報協議。 TCP抽象是一個流 - 你的服務器不應該關心單個數據包。無論如何,如果Ruby不會搞亂你的數據包,那麼一些中介(例如路由器)可能會這樣。 – hrnt 2009-11-02 13:40:29

回答

1

TCP是一個流協議。它不關心應用程序「消息」。 TCP理論上可以在一個數據包或1024個數據包中發送1024個字節。也就是說,請記住以太網MTU是1500字節。因子IP header(通常爲20)和TCP header(至少爲20)。然後,您的2000-char消息必須以至少兩個數據包發送。 TCP也可以進行流量控制,這可能與問題有關。找出線路上發生的事情的最好方法是使用tcpdumpwireshark

0

在實踐中傳輸數據所需的數據包數量對流的影響應該很小。你可能遇到的是你的實現中的緩衝問題。

只有當套接字處於「可寫入」狀態時纔會寫入套接字,否則可能會導致輸出緩衝區溢出並導致連接被您的網絡堆棧丟棄。由於TCP/IP套接字作爲一個簡單的數據流,在數據進入並按順序出現的情況下,除非對時間敏感的應用程序,否則數據包碎片的影響應該是無關緊要的。

確保你寫插座時,刷新你的輸出緩衝區,或者你可能有一些留下的數據等待發送:

@socket.write(my_data) 
@socket.flush