Я могу установить тайм-аут для UdpClient в C#?

Я задаюсь вопросом, могу ли я установить значение тайм-аута для UdpClient, получают метод.

Я хочу использовать блочный режим, но потому что иногда udp будет потерянный пакет, моя программа udpClient.receive зависнет там навсегда.

какие-либо хорошие идеи, как я могу управлять этим?

35
задан Jack 17 February 2010 в 14:31
поделиться

2 ответа

То, что имеет в виду Филип, вложено в сокет, который содержит UdpClient ( UdpClient.Client.ReceiveTimeout ) .

Для этого также можно использовать асинхронные методы, но вручную заблокировать выполнение:

var timeToWait = TimeSpan.FromSeconds(10);

var udpClient = new UdpClient( portNumber );
var asyncResult = udpClient.BeginReceive( null, null );
asyncResult.AsyncWaitHandle.WaitOne( timeToWait );
if (asyncResult.IsCompleted)
{
    try
    {
        IPEndPoint remoteEP = null;
        byte[] receivedData = udpClient.EndReceive( asyncResult, ref remoteEP );
        // EndReceive worked and we have received data and remote endpoint
    }
    catch (Exception ex)
    {
        // EndReceive failed and we ended up here
    }
} 
else
{
    // The operation wasn't completed before the timeout and we're off the hook
}
27
ответ дан 27 November 2019 в 06:39
поделиться
>>> tuple(['hello'])
('hello',)

Но встроенный синтаксис существует не просто так.

-121--3832373-

Во-первых, не храните сами объекты на карте, храните указатели на объекты.

Во-вторых, нужно дать экземпляр Scene_Branding std::make_pair, а не самому классу.

ПРАВКА: Вот то, как вы идете о хранении указателей:

 string CurrentScene = "Scene_Branding";
 map<string, Scene*> Scenes;
 Scenes.insert(std::make_pair("Scene_Branding", new Scene_Branding()));

, Но, так как вы спросили этот тип вопроса, я рекомендую, чтобы вы прочитали хороший c ++ книга для дальнейшего схватывания понятий как указатели.

-121--2496176-

Существует свойство ReceiveTimeout, которое можно использовать.

2
ответ дан 27 November 2019 в 06:39
поделиться
Другие вопросы по тегам:

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