diff options
author | Martin Lucina <martin@lucina.net> | 2012-01-23 08:53:19 +0100 |
---|---|---|
committer | Martin Lucina <martin@lucina.net> | 2012-01-23 08:53:19 +0100 |
commit | a15854bd92db69fcd0b4444fe1b8fe3610a7acf6 (patch) | |
tree | 1214b945d0f0033ff318de367c70525ea141ef56 /src/pgm_socket.hpp |
Imported Upstream version 2.0.7.dfsgupstream/2.0.7.dfsg
Diffstat (limited to 'src/pgm_socket.hpp')
-rw-r--r-- | src/pgm_socket.hpp | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/src/pgm_socket.hpp b/src/pgm_socket.hpp new file mode 100644 index 0000000..b9f55d1 --- /dev/null +++ b/src/pgm_socket.hpp @@ -0,0 +1,105 @@ +/* + Copyright (c) 2007-2010 iMatix Corporation + + This file is part of 0MQ. + + 0MQ is free software; you can redistribute it and/or modify it under + the terms of the Lesser GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + 0MQ is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + Lesser GNU General Public License for more details. + + You should have received a copy of the Lesser GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef __PGM_SOCKET_HPP_INCLUDED__ +#define __PGM_SOCKET_HPP_INCLUDED__ + +#include "platform.hpp" + +#if defined ZMQ_HAVE_OPENPGM + +#ifdef ZMQ_HAVE_WINDOWS +#include "windows.hpp" +#endif + +#include <pgm/pgm.h> + +#include "options.hpp" + +namespace zmq +{ + // Encapsulates PGM socket. + class pgm_socket_t + { + + public: + // If receiver_ is true PGM transport is not generating SPM packets. + // interface format: iface;mcast_group:port for raw PGM socket + // udp:iface;mcast_goup:port for UDP encapsulacion + pgm_socket_t (bool receiver_, const options_t &options_); + + // Closes the transport. + ~pgm_socket_t (); + + // Initialize PGM network structures (GSI, GSRs). + int init (bool udp_encapsulation_, const char *network_); + + // Get receiver fds and store them into user allocated memory. + void get_receiver_fds (int *receive_fd_, int *waiting_pipe_fd_); + + // Get sender and receiver fds and store it to user allocated + // memory. Receive fd is used to process NAKs from peers. + void get_sender_fds (int *send_fd_, int *receive_fd_, + int *rdata_notify_fd_, int *pending_notify_fd_); + + // Send data as one APDU, transmit window owned memory. + size_t send (unsigned char *data_, size_t data_len_); + + // Returns max tsdu size without fragmentation. + size_t get_max_tsdu_size (); + + // Receive data from pgm socket. + ssize_t receive (void **data_, const pgm_tsi_t **tsi_); + + // POLLIN on sender side should mean NAK or SPMR receiving. + // process_upstream function is used to handle such a situation. + void process_upstream (); + + private: + + // OpenPGM transport + pgm_transport_t* transport; + + // Associated socket options. + options_t options; + + // true when pgm_socket should create receiving side. + bool receiver; + + // Array of pgm_msgv_t structures to store received data + // from the socket (pgm_transport_recvmsgv). + pgm_msgv_t *pgm_msgv; + + // Size of pgm_msgv array. + size_t pgm_msgv_len; + + // How many bytes were read from pgm socket. + size_t nbytes_rec; + + // How many bytes were processed from last pgm socket read. + size_t nbytes_processed; + + // How many messages from pgm_msgv were already sent up. + size_t pgm_msgv_processed; + }; +} +#endif + +#endif + |