2016-06-07 3 views
0

Я получаю сообщение (я использую этот способ, потому что я делаю что-то во время ожидания сообщений). Но я тестировал это соединение, и я отправляю сообщения очень близко к друг другу, но кажется, что один из них потерялся. Я не знаю, как это исправить. как я могу включить параметр «read buffer» или что-то подобное?Буфер для сообщений async Udp

спасибо .. вот код:

// функция для получения UDP сообщение

public static void ReceiveCallback(IAsyncResult ar) 
    { 

     UdpClient u = (UdpClient)((UdpState)(ar.AsyncState)).u; 

     //IPEndPoint e = (IPEndPoint)((UdpState)(ar.AsyncState)).e; 

     Byte[] receiveBytes = u.EndReceive(ar, ref IpEndPoint_groupEP); 
     received_data_from_client = Encoding.ASCII.GetString(receiveBytes); 
     messageReceived = true; 
     Logger("Received a message from : " + IpEndPoint_groupEP.ToString()); 
     u.Close(); 
    } 

    public static void ReceiveMessages() 
    { 

     IpEndPoint_groupEP.Address = (IPAddress.Any); 
     IpEndPoint_groupEP.Port = listenPort; 

     //IPEndPoint e = new IPEndPoint(IPAddress.Any, listenPort); 

     UdpClient u = new UdpClient(IpEndPoint_groupEP); 

     UdpState s = new UdpState(); 

     s.e = IpEndPoint_groupEP; 
     s.u = u; 

     u.BeginReceive(new AsyncCallback(ReceiveCallback), s); 

    while (!messageReceived) 
      { 
        Thread.Sleep(50); 
Console.writeLine("Hello") 


} 

Я имею u.close, потому что эта функция вызывается более после этого один. У меня есть цикл while, поэтому программа считывает сообщения и делает что-то с сообщением, а затем, когда это делается, он возвращается назад и вызывает функцию ReceiveMessages, чтобы начать читать другое сообщение. И в основном, когда программа не получила сообщение, она выкрикивает «Hello»

Это работает как шарм. Однако я понял, что при одновременном получении двух или нескольких сообщений, только чтение одного из них, и я теряю другие

+1

Вы выполняете 'u.Close()' в 'ReceiveCallback', почему вы ожидаете, что он будет работать более одного раза? –

+0

Извините, я только что обновил .. – George

ответ

1

Проблема в том, что вы закрываете порт между сообщениями. Вместо того, чтобы делать этим движение создания порта за пределами ReceiveMessages()

public static void ReceiveCallback(IAsyncResult ar) 
{ 

    UdpClient u = (UdpClient)((UdpState)(ar.AsyncState)).u; 

    //IPEndPoint e = (IPEndPoint)((UdpState)(ar.AsyncState)).e; 

    Byte[] receiveBytes = u.EndReceive(ar, ref IpEndPoint_groupEP); 
    received_data_from_client = Encoding.ASCII.GetString(receiveBytes); 
    messageReceived = true; 
    Logger("Received a message from : " + IpEndPoint_groupEP.ToString()); 
} 

public static UdpClient CreateClient() 
{ 
    IpEndPoint_groupEP.Address = (IPAddress.Any); 
    IpEndPoint_groupEP.Port = listenPort; 

    UdpClient u = new UdpClient(IpEndPoint_groupEP); 
    return u; 
} 

public static void ReceiveMessages(UdpClient u) 
{ 

    UdpState s = new UdpState(); 

    s.e = IpEndPoint_groupEP; 
    s.u = u; 

    u.BeginReceive(new AsyncCallback(ReceiveCallback), s); 

    while (!messageReceived) 
    { 
      Thread.Sleep(50); 
      Console.writeLine("Hello") 
    } 
} 

Однако, потому что единственным, что вы делаете после того, как вы делаете BeginReceive это начать ожидание в цикле ничего не делая, вы можете рассмотреть вопрос о избавлении от асинхронного обратного вызова и просто позвоните Receive и заблокируйте его.

+0

Здравствуйте, Спасибо за ваш ответ. Я действительно делаю что-то во время цикла while, но он делает кучу вещей и ради простоты для кода, который я не хотел включать в вопрос. Я попробую ваш метод и дам вам знать, работает оно или нет! – George

+0

Здравствуйте, Когда я попробовал решение, я получил следующую ошибку: System.Net.Sockets.SocketException (0x80004005): Разрешено только одно использование каждого адреса сокета (протокол/сетевой адрес/порт) в System.Net.Sockets .Socket.DoBind (EndPoint endPointSnapshot, SocketAddress socketAddress) в System.Net.Sockets.Socket.Bind (EndPoint localEP) в System.Net.Sockets.UdpClient..ctor (IPEndPoint localEP) – George

+1

Вам нужно только позвонить 'CreateClient 'однажды, вы вызываете' ReceiveMessages' несколько раз, но передаете тот же 'UdpClient' в качестве параметра. –

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