zmq::pgm_socket_t::pgm_socket_t (bool receiver_, const char *interface_, size_t readbuf_size_) : g_transport (NULL), receiver (receiver_), port_number (0), udp_encapsulation (false), readbuf_size (readbuf_size_), pgm_msgv (NULL), nbytes_rec (0), nbytes_processed (0), pgm_msgv_processed (0), pgm_msgv_len (0) { // Check if we are encapsulating into UDP, interface string has to // start with udp:. const char *interface_ptr = interface_; if (strlen (interface_) >= 4 && interface_ [0] == 'u' && interface_ [1] == 'd' && interface_ [2] == 'p' && interface_ [3] == ':') { // Shift interface_ptr after ':'. interface_ptr += 4; udp_encapsulation = true; } // Parse port number. const char *port_delim = strchr (interface_ptr, ':'); assert (port_delim); port_number = atoi (port_delim + 1); // Store interface string. assert (port_delim > interface_ptr); assert (port_delim - interface_ptr < (int) sizeof (network) - 1); memset (network, '\0', sizeof (network)); memcpy (network, interface_ptr, port_delim - interface_ptr); zmq_log (1, "parsed: network %s, port %i, udp encaps. %s, %s(%i)\n", network, port_number, udp_encapsulation ? "yes" : "no", __FILE__, __LINE__); // Open PGM transport. open_transport (); // For receiver transport preallocate pgm_msgv array. if (receiver_) { pgm_msgv_len = get_max_apdu_at_once (readbuf_size_); pgm_msgv = new pgm_msgv_t [pgm_msgv_len]; } }
int zmq::pgm_socket_t::init (bool udp_encapsulation_, const char *network_) { udp_encapsulation = udp_encapsulation_; // Parse port number. const char *port_delim = strchr (network_, ':'); if (!port_delim) { errno = EINVAL; return -1; } port_number = atoi (port_delim + 1); if (port_delim - network_ >= (int) sizeof (network) - 1) { errno = EINVAL; return -1; } memset (network, '\0', sizeof (network)); memcpy (network, network_, port_delim - network_); // Open PGM transport. int rc = open_transport (); if (rc != 0) return -1; // For receiver transport preallocate pgm_msgv array. // in_batch_size configured in confing.hpp if (receiver) { pgm_msgv_len = get_max_apdu_at_once (in_batch_size); // TODO: use malloc instead of new pgm_msgv = new pgm_msgv_t [pgm_msgv_len]; } return 0; }