Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> C# RecvFrom скоро мозгом двинусь 
:(
    Опции темы
b161985
Дата 3.8.2014, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 3.8.2014

Репутация: нет
Всего: нет



Код

public static void ReceiveFrom4()
{
    IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 9999);
 
    Socket s = new Socket(endPoint.Address.AddressFamily,
        SocketType.Dgram,
        ProtocolType.Udp);
    IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
    EndPoint senderRemote = (EndPoint)sender;
    s.Bind(endPoint);
    byte[] msg = new Byte[4];
    int r=0;
    try
    {
        r=s.ReceiveFrom(msg, 0, msg.Length, SocketFlags.None, ref senderRemote);
    }
    catch(Exception e)
    {
        Console.WriteLine(e.Message);
    }
    Console.WriteLine(Encoding.ASCII.GetString(msg, 0, msg.Length)+" size="+r.ToString());
    s.Close();
}



не могу понять как мне считать определенное количество байт функцией ReceiveFrom. она кидает мне исключение так как данных приходит больше чем размер буфера

Цитата

"A message sent on a datagram socket was larger than the internal message buffer or some other network limit, or the buffer used to receive a datagram into was smaller than the datagram itself"


что является странным, так как я явно указал размер буфера. 
я хочу сделать так скачала скачиваю DWORD например в котором храниться размер потом кусочками качаю все остальное. на сях у меня с одноименной функой проблем нет. 

направьте в нужное русло
PM MAIL   Вверх
mihryak
Дата 4.8.2014, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 3
Всего: 36



Отсюда:
Цитата

If the datagram you receive is larger than the size of buffer, the ReceiveFrom method will fill buffer with as much of the message as is possible, and throw a SocketException. If you are using an unreliable protocol, the excess data will be lost. If you are using a reliable protocol, the excess data will be retained by the service provider and you can retrieve it by calling the ReceiveFrom method with a large enough buffer.

Сервер посылает больше данных, чем размер объявленного буфера.
PM MAIL ICQ   Вверх
Ilya81
Дата 4.8.2014, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 18.4.2014
Где: ЛО, Всеволожский р-н

Репутация: нет
Всего: 4



Из документации:
Цитата

При использовании протоколов без установления соединения метод ReceiveFrom будет читать первую поставленную в очередь датаграмму, которая получена в локальном сетевом буфере. Если размер полученной датаграммы превышает значение параметра buffer, метод ReceiveFrom поместит в buffer приемлемую часть сообщения, а затем создаст исключение SocketException. Если используется ненадежный протокол, избыточные данные будут потеряны. При использовании надежного протокола избыточные данные будут сохранены поставщиком услуг и их можно будет извлечь путем обращения к методу ReceiveFrom с указанием достаточно большого размера буфера.
При отсутствии доступных для чтения данных метод ReceiveFrom будет выполнять блокирование до тех пор, пока не появятся данные. Если используется неблокирующий режим и отсутствуют данные в стековом буфере протокола, метод ReceiveFrom немедленно завершится и создаст исключение SocketException. Чтобы определить наличие данных, доступных для чтения, можно использовать свойство Available. Когда значение свойства Available не равно нулю, повторите операцию приема.

Так что он через исключение обозначает, что часть отправленных по UDP данных теряется. Иначе нужно размер ставить в величину Available.
PM MAIL ICQ Skype   Вверх
Google
  Дата 25.8.2019, 14:59 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
cully
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, cully, mr.DUDA, Exception.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Распределённые приложения и сеть | Следующая тема »


 




[ Время генерации скрипта: 0.1148 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.