2010-06-23 81 views
0

當我使用sendto()發送消息時,出現錯誤「消息太長」?在C#中Socket通信中的消息太長錯誤#

Socket tcpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

如何找到我可以發送的最大可能尺寸?我可以改變它嗎?這裏有什麼可能的問題?

回答

1

首先,SendTo僅用於UDP套接字。在上面的代碼片段中,您正在打開一個TCP套接字。 SendTo將不能使用TCP套接字。嘗試使用UDP套接字並查看它是否有效。請記住,UDP數據包的最大實際大小爲65,507字節。一般來說,您希望保持較小的UDP數據包,以避免參與傳輸的各種網絡元素造成碎片。

編輯:

使用TcpClient,使您的生活更輕鬆。

Int32 port = 13293; 
String host = "somehost.com"; 
TcpClient tcpClient = new TcpClient(host, port); 

Byte[] data = System.Text.Encoding.ASCII.GetBytes("your message to send"); 

NetworkStream stream = tcpClient.GetStream(); 

stream.Write(data, 0, data.Length); 
+0

或者連接的TCP套接字,並使用'Send'。 – 2010-06-23 02:47:50

+0

我正在使用連接,然後sendto。我也嘗試使用Stream.write()。但是我仍然得到同樣的錯誤。我必須使用TCP套接字並且不能使用UDP。另外我的消息大小几乎是30個字節。 – Sam 2010-06-23 17:26:29

+0

我用一個使用TcpClient的例子更新了答案。 – 2010-06-23 19:01:14

-1

從Linux手冊頁的插座(),你應該能夠使用的sysctl(2)或的/ proc/SYS /網/核心/ *文件。 我覺得特別,你可以使用以下命令:

rmem_default
包含在插座的字節的默認設置接收緩衝區。
rmem_max
包含用戶可以使用SO_RCVBUF套接字選項設置的最大套接字接收緩衝區大小(以字節爲單位)。

  • 使用第一個來檢查接收緩衝區的默認大小。
  • 看看第二個來確定最大大小,並確保您發送的數據包的大小小於此。
  • 使用SO_RCVBUF套接字選項來更改接收緩衝區的大小。