示例#1
0
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];
    }

}
示例#2
0
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;
}