public static SocketAwaitable ReceiveMessageFromAsync(this Socket socket, SocketAwaitable awaitable) { awaitable.Reset(); if (!socket.ReceiveMessageFromAsync(awaitable.m_eventArgs)) { awaitable.m_wasCompleted = true; } return(awaitable); }
public static SocketAwaitable SendToAsync(this Socket socket, SocketAwaitable awaitable) { awaitable.Reset(); if (!socket.SendToAsync(awaitable.m_eventArgs)) { awaitable.m_wasCompleted = true; } return(awaitable); }
/// <summary> /// Sends a response message. /// </summary> /// <param name="response"> /// A <see cref="ISnmpMessage"/>. /// </param> /// <param name="receiver">Receiver.</param> public async Task SendResponseAsync(ISnmpMessage response, EndPoint receiver) { if (_disposed) { throw new ObjectDisposedException(GetType().FullName); } if (response == null) { throw new ArgumentNullException(nameof(response)); } if (receiver == null) { throw new ArgumentNullException(nameof(receiver)); } if (_disposed) { throw new ObjectDisposedException("Listener"); } if (_socket == null) { return; } var buffer = response.ToBytes(); var info = SocketExtension.EventArgsFactory.Create(); try { info.RemoteEndPoint = receiver; info.SetBuffer(buffer, 0, buffer.Length); using (var awaitable1 = new SocketAwaitable(info)) { await _socket.SendToAsync(awaitable1); } } catch (SocketException ex) { if (ex.SocketErrorCode != SocketError.Interrupted) { // IMPORTANT: interrupted means the socket is closed. throw; } } }
private async Task ReceiveAsync() { while (true) { // If no more active, then stop. if (Interlocked.Exchange(ref _active, _active) == Inactive) { return; } int count; var reply = new byte[_bufferSize]; var args = SocketExtension.EventArgsFactory.Create(); try { EndPoint remote = _socket.AddressFamily == AddressFamily.InterNetwork ? new IPEndPoint(IPAddress.Any, 0) : new IPEndPoint(IPAddress.IPv6Any, 0); args.RemoteEndPoint = remote; args.SetBuffer(reply, 0, _bufferSize); using (var awaitable = new SocketAwaitable(args)) { count = await _socket.ReceiveMessageFromAsync(awaitable); } await Task.Factory.StartNew(() => HandleMessage(reply, count, (IPEndPoint)args.RemoteEndPoint)); } catch (SocketException ex) { // ignore WSAECONNRESET, http://bytes.com/topic/c-sharp/answers/237558-strange-udp-socket-problem if (ex.SocketErrorCode != SocketError.ConnectionReset) { // If the SnmpTrapListener was active, marks it as stopped and call HandleException. // If it was inactive, the exception is likely to result from this, and we raise nothing. var activeBefore = Interlocked.CompareExchange(ref _active, Inactive, Active); if (activeBefore == Active) { HandleException(ex); } } } } }