Информация об изменениях

Сообщение UDPClient от 16.04.2015 15:22

Изменено 16.04.2015 15:23 tyomchick

Добрый день

Помогите пожалуйста разобраться с сабжем.

В общем есть задача опроса многих (тысячи) устройств по UDP (устройства в GPRS).
Решил воспользоваться классом UDPClient.
Использую функции асинхронного чтения и записи ReceiveAsync, SendAsync, которые возвращают Task-и, через которые можно ждать завершения операции и читать результат.

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

После отсылки пакетов на ряд адресов вызов ReceiveAsync завершается Task-ом c выставленным IsFaulted и в Task.Exception у него лежит такая вот гадость:

System.AggregateException: One or more errors occurred. ---> System.Net.Sockets.SocketException: The connection has been broken due to keep-alive activity detecting a failure while the operation was in progress
at System.Net.Sockets.Socket.EndReceiveFrom(IAsyncResult asyncResult, EndPoint& endPoint)
at System.Net.Sockets.UdpClient.EndReceive(IAsyncResult asyncResult, IPEndPoint& remoteEP)
at System.Net.Sockets.UdpClient.<ReceiveAsync>b__4(IAsyncResult ar)
at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)

В msdn msdn написано, что:

For a datagram socket, this error indicates that the time to live has expired.

Причем, если после этого вызвать ReceiveAsync, то уже при вызове вылетает точно такое же исключение, приходятся пересоздавать UDPClient.

Собственно вопроса 2:
1. Как понять для какого пакета (IPEndPoint) вышел TTL. Запросы одновременно могут посылаться в сотни адресов.
2. Как продолжить работу, не пересоздавая сокет.
Добрый день

Помогите пожалуйста разобраться с сабжем.

В общем есть задача опроса многих (тысячи) устройств по UDP (устройства в GPRS).
Решил воспользоваться классом UDPClient.
Использую функции асинхронного чтения и записи ReceiveAsync, SendAsync, которые возвращают Task-и, через которые можно ждать завершения операции и читать результат.

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

После отсылки пакетов на ряд адресов вызов ReceiveAsync завершается Task-ом c выставленным IsFaulted и в Task.Exception у него лежит такая вот гадость:

System.AggregateException: One or more errors occurred. ---> System.Net.Sockets.SocketException: The connection has been broken due to keep-alive activity detecting a failure while the operation was in progress
at System.Net.Sockets.Socket.EndReceiveFrom(IAsyncResult asyncResult, EndPoint& endPoint)
at System.Net.Sockets.UdpClient.EndReceive(IAsyncResult asyncResult, IPEndPoint& remoteEP)
at System.Net.Sockets.UdpClient.<ReceiveAsync>b__4(IAsyncResult ar)
at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)

В msdn msdn написано, что:

For a datagram socket, this error indicates that the time to live has expired.

Причем, если после этого вызвать ReceiveAsync, то уже при вызове вылетает точно такое же исключение, приходятся пересоздавать UDPClient.

Собственно вопроса 2:
1. Как понять для какого пакета (IPEndPoint) вышел TTL. Запросы одновременно могут посылаться в сотни адресов.
2. Как продолжить работу, не пересоздавая сокет.