SOCKET zsys_udp_new (bool routable) { // We haven't implemented multicast yet assert (!routable); int udpsock = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (udpsock == INVALID_SOCKET) { zsys_socket_error ("socket"); return INVALID_SOCKET; } // Ask operating system for broadcast permissions on socket int on = 1; if (setsockopt (udpsock, SOL_SOCKET, SO_BROADCAST, (char *) &on, sizeof (on)) == SOCKET_ERROR) zsys_socket_error ("setsockopt (SO_BROADCAST)"); // Allow multiple owners to bind to socket; incoming // messages will replicate to each owner if (setsockopt (udpsock, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof (on)) == SOCKET_ERROR) zsys_socket_error ("setsockopt (SO_REUSEADDR)"); #if defined (SO_REUSEPORT) // On some platforms we have to ask to reuse the port if (setsockopt (udpsock, SOL_SOCKET, SO_REUSEPORT, (char *) &on, sizeof (on)) == SOCKET_ERROR) zsys_socket_error ("setsockopt (SO_REUSEPORT)"); #endif return udpsock; }
JNIEXPORT void JNICALL Java_org_zeromq_czmq_Zsys__1_1socketError (JNIEnv *env, jclass c, jstring reason) { char *reason_ = (char *) (*env)->GetStringUTFChars (env, reason, NULL); zsys_socket_error (reason_); (*env)->ReleaseStringUTFChars (env, reason, reason_); }
zframe_t * zsys_udp_recv (SOCKET udpsock, char *peername) { char buffer [UDP_FRAME_MAX]; inaddr_t address; socklen_t address_len = sizeof (inaddr_t); ssize_t size = recvfrom ( udpsock, buffer, UDP_FRAME_MAX, 0, // Flags (struct sockaddr *) &address, &address_len); if (size == SOCKET_ERROR) zsys_socket_error ("recvfrom"); // Get sender address as printable string #if (defined (__WINDOWS__)) getnameinfo ((struct sockaddr *) &address, address_len, peername, INET_ADDRSTRLEN, NULL, 0, NI_NUMERICHOST); #else inet_ntop (AF_INET, &address.sin_addr, peername, address_len); #endif return zframe_new (buffer, size); }
static void s_self_prepare_udp (self_t *self) { // Create our UDP socket if (self->udpsock) zsys_udp_close (self->udpsock); self->hostname [0] = 0; self->udpsock = zsys_udp_new (false); if (self->udpsock == INVALID_SOCKET) return; // Get the network interface fro ZSYS_INTERFACE or else use first // broadcast interface defined on system. ZSYS_INTERFACE=* means // use INADDR_ANY + INADDR_BROADCAST. const char *iface = zsys_interface (); in_addr_t bind_to = 0; in_addr_t send_to = 0; if (streq (iface, "*")) { // Wildcard means bind to INADDR_ANY and send to INADDR_BROADCAST bind_to = INADDR_ANY; send_to = INADDR_BROADCAST; } else { // Look for matching interface, or first ziflist item ziflist_t *iflist = ziflist_new (); assert (iflist); const char *name = ziflist_first (iflist); while (name) { if (streq (iface, name) || streq (iface, "")) { // Using inet_addr instead of inet_aton or inet_atop // because these are not supported in Win XP send_to = inet_addr (ziflist_broadcast (iflist)); bind_to = inet_addr (ziflist_address (iflist)); if (self->verbose) zsys_info ("zbeacon: interface=%s address=%s broadcast=%s", name, ziflist_address (iflist), ziflist_broadcast (iflist)); break; // iface is known, so allow it } name = ziflist_next (iflist); } ziflist_destroy (&iflist); } if (bind_to) { self->broadcast.sin_family = AF_INET; self->broadcast.sin_port = htons (self->port_nbr); self->broadcast.sin_addr.s_addr = send_to; inaddr_t address = self->broadcast; address.sin_addr.s_addr = bind_to; // Bind to the port on all interfaces #if (defined (__WINDOWS__)) inaddr_t sockaddr = address; #elif (defined (__APPLE__)) inaddr_t sockaddr = self->broadcast; sockaddr.sin_addr.s_addr = htons (INADDR_ANY); #else inaddr_t sockaddr = self->broadcast; #endif // Bind must succeed; we treat failure here as a hard violation (assert) if (bind (self->udpsock, (struct sockaddr *) &sockaddr, sizeof (inaddr_t))) zsys_socket_error ("bind"); // Get our hostname so we can send it back to the API if (getnameinfo ((struct sockaddr *) &address, sizeof (inaddr_t), self->hostname, NI_MAXHOST, NULL, 0, NI_NUMERICHOST) == 0) { if (self->verbose) zsys_info ("zbeacon: configured, hostname=%s", self->hostname); } } }
/// // Handle an I/O error on some socket operation; will report and die on // fatal errors, and continue silently on "try again" errors. // *** This is for CZMQ internal use only and may change arbitrarily *** void QmlZsysAttached::socketError (const QString &reason) { zsys_socket_error (reason.toUtf8().data()); };
/// // Handle an I/O error on some socket operation; will report and die on // fatal errors, and continue silently on "try again" errors. // *** This is for CZMQ internal use only and may change arbitrarily *** void QZsys::socketError (const QString &reason) { zsys_socket_error (reason.toUtf8().data()); }