public AddPollInSocket ( [ socket, [ |
||
socket | [ | the Socket to add |
callback | [ |
the Action to add |
return | void |
static void Main(string[] args) { using (var context = NetMQContext.Create()) using (var udpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) using (var poller = new Poller()) { // Ask OS to let us do broadcasts from socket udpSocket.SetSocketOption(SocketOptionLevel.Udp, SocketOptionName.Broadcast, 1); // Bind UDP socket to local port so we can receive pings udpSocket.Bind(new IPEndPoint(IPAddress.Any, PingPortNumber)); // We use zmq_poll to wait for activity on the UDP socket, because // this function works on non-0MQ file handles. We send a beacon // once a second, and we collect and report beacons that come in // from other nodes: poller.AddPollInSocket(udpSocket, socket => { }); poller.PollTillCancelledNonBlocking(); //poller.ad //var poller = new z //var pollItemsList = new List<ZPollItem>(); //pollItemsList.Add(new ZPollItem(ZPoll.In)); //var pollItem = ZPollItem.CreateReceiver(); //ZMessage message; //ZError error; //pollItem.ReceiveMessage(udpSocket, out message, out error); //pollItem.ReceiveMessage = (ZSocket socket, out ZMessage message, out ZError error) => // Send first ping right away } }
private void Configure([NotNull] string interfaceName, int port) { // In case the beacon was configured twice if (m_udpSocket != null) { m_poller.RemovePollInSocket(m_udpSocket); m_udpSocket.Close(); } m_udpPort = port; m_udpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); m_poller.AddPollInSocket(m_udpSocket, OnUdpReady); // Ask operating system for broadcast permissions on socket m_udpSocket.EnableBroadcast = true; // Allow multiple owners to bind to socket; incoming // messages will replicate to each owner m_udpSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); IPAddress bindTo = null; IPAddress sendTo = null; if (interfaceName == "*") { bindTo = IPAddress.Any; sendTo = IPAddress.Broadcast; } else { var interfaceCollection = new InterfaceCollection(); var interfaceAddress = !string.IsNullOrEmpty(interfaceName) ? IPAddress.Parse(interfaceName) : null; foreach (var @interface in interfaceCollection) { if (interfaceAddress == null || @interface.Address.Equals(interfaceAddress)) { sendTo = @interface.BroadcastAddress; bindTo = @interface.Address; break; } } } if (bindTo != null) { m_broadcastAddress = new IPEndPoint(sendTo, m_udpPort); m_udpSocket.Bind(new IPEndPoint(bindTo, m_udpPort)); string hostname = ""; try { if (!IPAddress.Any.Equals(bindTo) && !IPAddress.IPv6Any.Equals(bindTo)) { var host = Dns.GetHostEntry(bindTo); hostname = host != null ? host.HostName : ""; } } catch (Exception) {} m_pipe.Send(hostname); } }