簡體   English   中英

使用Ruby TCPSocket指定數據包大小

[英]Specify packet size with Ruby TCPSocket

我正在使用Ruby測試使用套接字的C#網絡應用程序。 我用@socket = TCPSocket.new(IP,PORT)打開連接,它可以正常工作-直到我要發送的文本超過1024個字符為止。 然后,Ruby將消息分為兩部分。 C ++和C#將消息作為一個數據包發送,因此C#應用程序不需要加入這些部分。

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

編輯:您的所有答案都是正確的,但是在閱讀了很多關於此處的紅寶石套接字問題后,我找到了解決方案:

socket.send(msg,0x4)

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

我不知道這是否可以在Internet上使用,但可以在我的測試實驗室中使用。

謝謝。

TCP是流協議。 它不關心應用程序的“消息”。 理論上,TCP可以在一個數據包或1024個數據包中發送1024字節。 也就是說,請記住以太網MTU為1500字節。 IP標頭 (通常為20)和TCP標頭 (至少為20)中考慮因素。那么您的2000個字符的消息將必須至少以兩個數據包發送。 TCP還可以進行流量控制,這可能與該問題有關。 找出網絡上發生了什么的最好方法是使用tcpdumpwireshark

實際上,傳輸數據所需的數據包數量對流的影響很小。 您可能遇到的是實現中的緩沖問題。

僅當套接字處於“可寫”狀態時,才應寫入套接字,否則可能會導致輸出緩沖區溢出並導致網絡堆棧斷開連接的風險。

由於TCP / IP套接字的作用就像一個簡單的流,數據按順序傳入和傳出,因此,數據包分段的影響應該幾乎不相關,除了對時間非常敏感的應用程序外。

寫入套接字時,請確保刷新輸出緩沖區,否則可能還有一些數據等待發送:

@socket.write(my_data)
@socket.flush

暫無
暫無

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

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