private void Broadcast() { Socket sendUdpSocket = null; Socket receiveUdpSocket = null; try { var noticeForSend = new ScannerBroadcastNotice(_scanner.SerialNumber, _scanner.Status); sendUdpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Unspecified); sendUdpSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1); var sendEndPoint = new IPEndPoint(_broadcastIpAddress, UDP_BROADCAST_PORT); receiveUdpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Unspecified) { Blocking = false // режим неблокированной работы }; EndPoint receiveEndPoint = new IPEndPoint(IPAddress.Any, UDP_BROADCAST_PORT); receiveUdpSocket.Bind(receiveEndPoint); try { sendUdpSocket.SendTo(noticeForSend.Data, sendEndPoint); _logger.LogVerbose(Message.ScannerBrodcastMessageSended); } catch (Exception ex) { if (ex is RemotingException || ex is SocketException) _logger.LogInfo(Message.ScannerManagerSendingFirstMessageError, ex.Message); else _logger.LogError(Message.ScannerManagerSendingFirstMessageError, ex); } while (true) { try { while (receiveUdpSocket.Poll(READ_TIMEOUT, SelectMode.SelectRead)) { var data = new byte[ScannerBroadcastNotice.DATA_LENGTH]; receiveUdpSocket.ReceiveFrom(data, ref receiveEndPoint); if (_connectorEventsHandler == null) break; var remoteAdress = ((IPEndPoint) receiveEndPoint).Address.ToString(); if (string.CompareOrdinal(_scanner.IPAddress, remoteAdress) == 0) continue; var receivedData = new ScannerBroadcastNotice(data); _connectorEventsHandler.Connected( receivedData.SerialNumber, remoteAdress); } } catch (ThreadAbortException) { throw; } catch (Exception ex) { if (ex is RemotingException || ex is SocketException) _logger.LogInfo(Message.ScannerManagerPollMessageError, ex.Message); else _logger.LogError(Message.ScannerManagerPollMessageError, ex); } if (_stopBroadcastEvent.WaitOne(SEND_TIMEOUT)) return; try { sendUdpSocket.SendTo(noticeForSend.Data, sendEndPoint); _logger.LogVerbose(Message.ScannerBrodcastMessageSended); } catch (Exception ex) { if (ex is RemotingException || ex is SocketException) _logger.LogInfo(Message.ScannerManagerSendingMessageError, ex.Message); else _logger.LogError(Message.ScannerManagerSendingMessageError, ex, ex.Message); } } } catch (ThreadAbortException) { _logger.LogVerbose(Message.ScannerBrodcastMessagingStopped); } catch (Exception ex) { _logger.LogError(Message.ScannerManagerBroadcastError, ex); } finally { if (receiveUdpSocket != null) receiveUdpSocket.Close(); if (sendUdpSocket != null) sendUdpSocket.Close(); } }
private void Broadcast() { Socket sendUdpSocket = null; Socket receiveUdpSocket = null; try { var noticeForSend = new ScannerBroadcastNotice(_scanner.SerialNumber, _scanner.Status); sendUdpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Unspecified); sendUdpSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1); var sendEndPoint = new IPEndPoint(_broadcastIpAddress, UDP_BROADCAST_PORT); receiveUdpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Unspecified) { Blocking = false // режим неблокированной работы }; EndPoint receiveEndPoint = new IPEndPoint(IPAddress.Any, UDP_BROADCAST_PORT); receiveUdpSocket.Bind(receiveEndPoint); try { sendUdpSocket.SendTo(noticeForSend.Data, sendEndPoint); _logger.LogVerbose(Message.ScannerBrodcastMessageSended); } catch (Exception ex) { if (ex is RemotingException || ex is SocketException) { _logger.LogInfo(Message.ScannerManagerSendingFirstMessageError, ex.Message); } else { _logger.LogError(Message.ScannerManagerSendingFirstMessageError, ex); } } while (true) { try { while (receiveUdpSocket.Poll(READ_TIMEOUT, SelectMode.SelectRead)) { var data = new byte[ScannerBroadcastNotice.DATA_LENGTH]; receiveUdpSocket.ReceiveFrom(data, ref receiveEndPoint); if (_connectorEventsHandler == null) { break; } var remoteAdress = ((IPEndPoint)receiveEndPoint).Address.ToString(); if (string.CompareOrdinal(_scanner.IPAddress, remoteAdress) == 0) { continue; } var receivedData = new ScannerBroadcastNotice(data); _connectorEventsHandler.Connected( receivedData.SerialNumber, remoteAdress); } } catch (ThreadAbortException) { throw; } catch (Exception ex) { if (ex is RemotingException || ex is SocketException) { _logger.LogInfo(Message.ScannerManagerPollMessageError, ex.Message); } else { _logger.LogError(Message.ScannerManagerPollMessageError, ex); } } if (_stopBroadcastEvent.WaitOne(SEND_TIMEOUT)) { return; } try { sendUdpSocket.SendTo(noticeForSend.Data, sendEndPoint); _logger.LogVerbose(Message.ScannerBrodcastMessageSended); } catch (Exception ex) { if (ex is RemotingException || ex is SocketException) { _logger.LogInfo(Message.ScannerManagerSendingMessageError, ex.Message); } else { _logger.LogError(Message.ScannerManagerSendingMessageError, ex, ex.Message); } } } } catch (ThreadAbortException) { _logger.LogVerbose(Message.ScannerBrodcastMessagingStopped); } catch (Exception ex) { _logger.LogError(Message.ScannerManagerBroadcastError, ex); } finally { if (receiveUdpSocket != null) { receiveUdpSocket.Close(); } if (sendUdpSocket != null) { sendUdpSocket.Close(); } } }