Сообщение слишком длинная ошибка в сокете связи в C # - PullRequest
0 голосов
/ 23 июня 2010

Когда я использую sendto () для отправки сообщений, я получаю ошибку «message too long»?

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

Как узнать максимально возможный размер, который я могу отправить? Могу ли я изменить это? В чем может быть проблема здесь?

Ответы [ 2 ]

1 голос
/ 23 июня 2010

Прежде всего, 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 голосов
/ 23 июня 2010

На страницах руководства Linux для socket () вы сможете использовать файлы sysctls (2) или / proc / sys / net / core / *. Я думаю, в частности, вы могли бы использовать следующее:

rmem_default
содержит значение по умолчанию в байтах буфера приема сокета.
rmem_max
содержит максимальный размер буфера приема сокета в байтах, который пользователь может установить с помощью опции сокета SO_RCVBUF.

  • Используйте первый, чтобы проверить размер по умолчанию для буфера приема.
  • Посмотрите на второй, чтобы определить максимальный размер и убедиться, что размер отправляемых пакетов меньше этого.
  • Используйте параметр сокета SO_RCVBUF, чтобы изменить размер буфера приема.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...