2014-10-17 5 views
1

Я пытаюсь получить шесть сообщений от одноадресных клиентов UDP. Получатель выглядит так:C#. UDP unicast

UdpClient udpclient = new UdpClient(); 
IPEndPoint localEp = new IPEndPoint(IPAddress.Parse(ClientIP), ClientPort); 
udpclient.Client.Bind(localEp); 
udpclient.Client.ReceiveTimeout = 10000; 
bool isTimeExpired = false; 
while (!isTimeExpired) 
{ 
    byte[] buffer; 
    try 
    { 
     buffer = udpclient.Receive(ref localEp); 

    } 
    catch (SocketException) 
    { 
     isTimeExpired = true; 
     continue; 
    } 
    // Deserialize 
    // ... 
} 
udpclient.Close(); 

Программа работает, но иногда я не получаю 6 сообщений (2 или 3). Заявка отправителя:

UdpClient client = new UdpClient(); 

IPEndPoint remoteep = new IPEndPoint(IPAddress.Parse(ClientIP), ClientPort); 

// Serialize 
// ... 

stream.Position = 0; 
byte[] data = new Byte[stream.Length]; 
stream.Read(data, 0, Convert.ToInt32(stream.Length)); 
client.Send(data, data.Length, remoteep); 
stream.Close(); 
client.Close(); 

Я запускаю 6 экземпляров приложения-отправителя на одном компьютере (и одном экземпляре приемника). Мне нужно получать сообщения от каждого отправителя (всего шесть сообщений) все время. Где моя ошибка?

спасибо!

ответ

2

Это UDP. Нет никакой гарантии, что вы получили бы любые датаграмм, которые были отправлены. UDP по своей конструкции является ненадежным. «Пользователь» в UDP также мог бы обозначить «ненадежный». :)

FYI: также нет гарантии, что вы получите только одну копию любой датграммы, которая была отправлена. Также нет гарантии, что датаграммы будут поступать в том же порядке, в каком они были отправлены.

Если вам нужна такая надежность, тогда вам нужен TCP, а не UDP (или вам нужно сделать кучу дополнительной работы, чтобы заново изобрести кол-во TCP).

+0

Peter Duniho, я знаю, что UDP не гарантирует доставку. Я думал, что мне нужно положить что-то вроде «Thread.Sleep (1000);» где-то. Потому что, когда я запускаю эти программы на своем ПК в большинстве случаев, я получаю все 6 сообщений. Когда я запускаю их на своем ноутбуке, я не получаю сообщений в основном (получаю 2 или 3, иногда 0). Однако, спасибо! – user3649515

+0

Возможно, вы можете сделать что-то, что можно сделать для повышения надежности сетевого стека на этом компьютере. Но, в конечном счете, ваш код должен быть достаточно устойчивым, чтобы справляться с отсутствующими дейтаграммами. В этом отношении более высокая частота сбоев на этом компьютере, вероятно, является «хорошей», поскольку она дает вам лучшую тестовую среду, чтобы убедиться, что вы правильно обрабатывали обработку UDP. :) –

+0

Питер Дунихо, ладно, спасибо! – user3649515

 Смежные вопросы

  • Нет связанных вопросов^_^