Задать вопрос
@DeboshiR
Свободу разработчикам!!!

Как обойти ограничение на размер передаваемых пактов в сети?

Собственно есть 2 приложения - клиент и сервер.
Клиент отправляет текст произвольный длины на сервер, но сервер принимает только 1460 символов.
Код отправки:
IPEndPoint EndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 7000);
                Socket Connector = new Socket(EndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
                Connector.Connect(EndPoint);
                Byte[] SendBytes = Encoding.Default.GetBytes(Message);
                Connector.Send(SendBytes);
                Connector.Close();

Код приёма:
//Пришло сообщение
                    ReceiveSocket = Listen.AcceptSocket();
                    Byte[] Receive = new Byte[256];
                    //Читать сообщение будем в поток
                    using (MemoryStream MessageR = new MemoryStream())
                    {
                        //Количество считанных байт
                        Int32 ReceivedBytes;
                        do
                        {//Собственно читаем
                            ReceivedBytes = ReceiveSocket.Receive(Receive, Receive.Length, 0);
                            //и записываем в поток
                            MessageR.Write(Receive, 0, ReceivedBytes);
                            //Читаем до тех пор, пока в очереди не останется данных
                        } while (ReceiveSocket.Available > 0);
                        Debug.WriteLine("Received: " + Encoding.Default.GetString(MessageR.ToArray()));
                    }

Собственно с чем может быть связана проблема и как её решить?
  • Вопрос задан
  • 302 просмотра
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Socket::Send возвращает количество реально отправленных данных. На отправляющей стороне нужен цикл, проверяющий, всё ли, что было передано в Send было отправлено и повторяющий отправку для оставшихся данных.

Код принимающей стороны тоже нуждается в доработке, поскольку ReceiveSocket.Available говорит о том, сколько данных доступно для приёма в настоящий момент, а не сколько было послано с той стороны.

По-хорошему передающая и принимающая стороны должны реализовывать один и тот же конечный автомат, а поток данных должен содержать протокол, позволяющий принимающей стороне синхронизировать состояние своего автомата с состоянием автомата передающей стороны. Это могут быть сообщения фиксированного размера, строковый интерфейс (как, например, в HTTP), TLV, ASN.1, ...

1460 октетов -- типичный размер полезных данных в одном кадре ethernet содержащем сегмент TCP/IP.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы