Сообщение 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 написано, что:
Собственно вопроса 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 написано, что:
Причем, если после этого вызвать ReceiveAsync, то уже при вызове вылетает точно такое же исключение, приходятся пересоздавать UDPClient.For a datagram socket, this error indicates that the time to live has expired.
Собственно вопроса 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 написано, что:
Собственно вопроса 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 написано, что:
Причем, если после этого вызвать ReceiveAsync, то уже при вызове вылетает точно такое же исключение, приходятся пересоздавать UDPClient.For a datagram socket, this error indicates that the time to live has expired.
Собственно вопроса 2:
1. Как понять для какого пакета (IPEndPoint) вышел TTL. Запросы одновременно могут посылаться в сотни адресов.
2. Как продолжить работу, не пересоздавая сокет.