Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Распределённые приложения и сеть > C# RecvFrom скоро мозгом двинусь


Автор: b161985 3.8.2014, 12:21
Код

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 например в котором храниться размер потом кусочками качаю все остальное. на сях у меня с одноименной функой проблем нет. 

направьте в нужное русло

Автор: mihryak 4.8.2014, 12:05
http://msdn.microsoft.com/en-us/library/kbfwcz73%28v=vs.110%29.aspx:
Цитата

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.

Сервер посылает больше данных, чем размер объявленного буфера.

Автор: Ilya81 4.8.2014, 12:07
Из http://msdn.microsoft.com/en-us/library/kbfwcz73(v=vs.100).aspx:
Цитата

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

Так что он через исключение обозначает, что часть отправленных по UDP данных теряется. Иначе нужно размер ставить в величину Available.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)