forked from zeromq/libzmq
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added support for non-zmq tcp client connections to router socket.
- Created a new option ZMQ_ROUTER_RAW_SOCK - Added new raw_encoder and raw_decoder to receive and send messages in raw form to remote client - Added test case file tests/test_raw_sock.cpp o To create a raw router sock set the ZMQ_ROUTER_RAW_SOCK option o ZMQ_MSGMORE flag is ignored for non-id messages o To terminate a remote connection send id message followed by zero length data message
- Loading branch information
1 parent
19f77a1
commit 83387b4
Showing
17 changed files
with
615 additions
and
31 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -77,6 +77,7 @@ Toralf Wittner <[email protected]> | |
Tore Halvorsen <[email protected]> | ||
Vitaly Mayatskikh <[email protected]> | ||
Lourens Naudé <[email protected]> | ||
Hardeep Singh <[email protected]> | ||
|
||
Credits | ||
======= | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,99 @@ | ||
/* | ||
Copyright (c) 2009-2011 250bpm s.r.o. | ||
Copyright (c) 2007-2009 iMatix Corporation | ||
Copyright (c) 2007-2012 Other contributors as noted in the AUTHORS file | ||
This file is part of 0MQ. | ||
0MQ is free software; you can redistribute it and/or modify it under | ||
the terms of the GNU Lesser 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 | ||
GNU Lesser General Public License for more details. | ||
You should have received a copy of the GNU Lesser General Public License | ||
along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
*/ | ||
|
||
#include <stdlib.h> | ||
#include <string.h> | ||
|
||
#include "platform.hpp" | ||
#ifdef ZMQ_HAVE_WINDOWS | ||
#include "windows.hpp" | ||
#endif | ||
|
||
#include "raw_decoder.hpp" | ||
#include "likely.hpp" | ||
#include "wire.hpp" | ||
#include "err.hpp" | ||
|
||
zmq::raw_decoder_t::raw_decoder_t (size_t bufsize_, | ||
int64_t maxmsgsize_, i_msg_sink *msg_sink_) : | ||
decoder_base_t <raw_decoder_t> (bufsize_), | ||
msg_sink (msg_sink_), | ||
maxmsgsize (maxmsgsize_) | ||
{ | ||
int rc = in_progress.init (); | ||
errno_assert (rc == 0); | ||
} | ||
|
||
zmq::raw_decoder_t::~raw_decoder_t () | ||
{ | ||
int rc = in_progress.close (); | ||
errno_assert (rc == 0); | ||
} | ||
|
||
void zmq::raw_decoder_t::set_msg_sink (i_msg_sink *msg_sink_) | ||
{ | ||
msg_sink = msg_sink_; | ||
} | ||
|
||
bool zmq::raw_decoder_t::stalled () const | ||
{ | ||
return false; | ||
} | ||
|
||
bool zmq::raw_decoder_t::message_ready_size (size_t msg_sz) | ||
{ | ||
int rc = in_progress.init_size (msg_sz); | ||
if (rc != 0) { | ||
errno_assert (errno == ENOMEM); | ||
rc = in_progress.init (); | ||
errno_assert (rc == 0); | ||
decoding_error (); | ||
return false; | ||
} | ||
|
||
next_step (in_progress.data (), in_progress.size (), | ||
&raw_decoder_t::raw_message_ready); | ||
|
||
return true; | ||
} | ||
|
||
bool zmq::raw_decoder_t::raw_message_ready () | ||
{ | ||
zmq_assert (in_progress.size ()); | ||
// Message is completely read. Push it further and start reading | ||
// new message. (in_progress is a 0-byte message after this point.) | ||
if (unlikely (!msg_sink)) | ||
return false; | ||
int rc = msg_sink->push_msg (&in_progress); | ||
if (unlikely (rc != 0)) { | ||
if (errno != EAGAIN) | ||
decoding_error (); | ||
return false; | ||
} | ||
|
||
// NOTE: This is just to break out of process_buffer | ||
// raw_message_ready should never get called in state machine w/o | ||
// message_ready_size from stream_engine. | ||
next_step (in_progress.data (), 1, | ||
&raw_decoder_t::raw_message_ready); | ||
|
||
return true; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
/* | ||
Copyright (c) 2009-2011 250bpm s.r.o. | ||
Copyright (c) 2007-2012 iMatix Corporation | ||
Copyright (c) 2007-2012 Other contributors as noted in the AUTHORS file | ||
This file is part of 0MQ. | ||
0MQ is free software; you can redistribute it and/or modify it under | ||
the terms of the GNU Lesser 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 | ||
GNU Lesser General Public License for more details. | ||
You should have received a copy of the GNU Lesser General Public License | ||
along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
*/ | ||
|
||
#ifndef __ZMQ_RAW_DECODER_HPP_INCLUDED__ | ||
#define __ZMQ_RAW_DECODER_HPP_INCLUDED__ | ||
|
||
#include "err.hpp" | ||
#include "msg.hpp" | ||
#include "decoder.hpp" | ||
#include "raw_decoder.hpp" | ||
#include "i_msg_sink.hpp" | ||
#include "stdint.hpp" | ||
|
||
namespace zmq | ||
{ | ||
|
||
// Decoder for 0MQ v1 framing protocol. Converts data stream into messages. | ||
|
||
class raw_decoder_t : public decoder_base_t <raw_decoder_t> | ||
{ | ||
public: | ||
|
||
raw_decoder_t (size_t bufsize_, | ||
int64_t maxmsgsize_, i_msg_sink *msg_sink_); | ||
virtual ~raw_decoder_t (); | ||
|
||
// i_decoder interface. | ||
virtual void set_msg_sink (i_msg_sink *msg_sink_); | ||
|
||
virtual bool stalled () const; | ||
|
||
virtual bool message_ready_size (size_t msg_sz); | ||
|
||
private: | ||
|
||
|
||
bool raw_message_ready (); | ||
|
||
i_msg_sink *msg_sink; | ||
msg_t in_progress; | ||
|
||
const int64_t maxmsgsize; | ||
|
||
raw_decoder_t (const raw_decoder_t&); | ||
void operator = (const raw_decoder_t&); | ||
}; | ||
|
||
} | ||
|
||
#endif | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,87 @@ | ||
/* | ||
Copyright (c) 2007-2012 iMatix Corporation | ||
Copyright (c) 2009-2011 250bpm s.r.o. | ||
Copyright (c) 2011 VMware, Inc. | ||
Copyright (c) 2007-2012 Other contributors as noted in the AUTHORS file | ||
This file is part of 0MQ. | ||
0MQ is free software; you can redistribute it and/or modify it under | ||
the terms of the GNU Lesser 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 | ||
GNU Lesser General Public License for more details. | ||
You should have received a copy of the GNU Lesser General Public License | ||
along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
*/ | ||
|
||
#include "encoder.hpp" | ||
#include "raw_encoder.hpp" | ||
#include "i_msg_source.hpp" | ||
#include "likely.hpp" | ||
#include "wire.hpp" | ||
|
||
zmq::raw_encoder_t::raw_encoder_t (size_t bufsize_, i_msg_source *msg_source_) : | ||
encoder_base_t <raw_encoder_t> (bufsize_), | ||
msg_source (msg_source_) | ||
{ | ||
int rc = in_progress.init (); | ||
errno_assert (rc == 0); | ||
|
||
// Write 0 bytes to the batch and go to message_ready state. | ||
next_step (NULL, 0, &raw_encoder_t::raw_message_ready, true); | ||
} | ||
|
||
zmq::raw_encoder_t::~raw_encoder_t () | ||
{ | ||
int rc = in_progress.close (); | ||
errno_assert (rc == 0); | ||
} | ||
|
||
void zmq::raw_encoder_t::set_msg_source (i_msg_source *msg_source_) | ||
{ | ||
msg_source = msg_source_; | ||
} | ||
|
||
bool zmq::raw_encoder_t::raw_message_size_ready () | ||
{ | ||
// Write message body into the buffer. | ||
next_step (in_progress.data (), in_progress.size (), | ||
&raw_encoder_t::raw_message_ready, !(in_progress.flags () & msg_t::more)); | ||
return true; | ||
} | ||
|
||
bool zmq::raw_encoder_t::raw_message_ready () | ||
{ | ||
|
||
// Destroy content of the old message. | ||
int rc = in_progress.close (); | ||
errno_assert (rc == 0); | ||
|
||
// Read new message. If there is none, return false. | ||
// Note that new state is set only if write is successful. That way | ||
// unsuccessful write will cause retry on the next state machine | ||
// invocation. | ||
if (unlikely (!msg_source)) { | ||
rc = in_progress.init (); | ||
errno_assert (rc == 0); | ||
return false; | ||
} | ||
rc = msg_source->pull_msg (&in_progress); | ||
if (unlikely (rc != 0)) { | ||
errno_assert (errno == EAGAIN); | ||
rc = in_progress.init (); | ||
errno_assert (rc == 0); | ||
return false; | ||
} | ||
|
||
in_progress.reset_flags(0xff); | ||
next_step (NULL, 0, &raw_encoder_t::raw_message_size_ready, true); | ||
|
||
return true; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
/* | ||
Copyright (c) 2009-2011 250bpm s.r.o. | ||
Copyright (c) 2007-2009 iMatix Corporation | ||
Copyright (c) 2007-2012 Other contributors as noted in the AUTHORS file | ||
This file is part of 0MQ. | ||
0MQ is free software; you can redistribute it and/or modify it under | ||
the terms of the GNU Lesser 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 | ||
GNU Lesser General Public License for more details. | ||
You should have received a copy of the GNU Lesser General Public License | ||
along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
*/ | ||
|
||
#ifndef __ZMQ_RAW_ENCODER_HPP_INCLUDED__ | ||
#define __ZMQ_RAW_ENCODER_HPP_INCLUDED__ | ||
|
||
#if defined(_MSC_VER) | ||
#ifndef NOMINMAX | ||
#define NOMINMAX | ||
#endif | ||
#endif | ||
|
||
#include <stddef.h> | ||
#include <string.h> | ||
#include <stdlib.h> | ||
#include <algorithm> | ||
|
||
#include "err.hpp" | ||
#include "msg.hpp" | ||
#include "i_encoder.hpp" | ||
|
||
namespace zmq | ||
{ | ||
|
||
|
||
// Encoder for 0MQ framing protocol. Converts messages into data batches. | ||
|
||
class raw_encoder_t : public encoder_base_t <raw_encoder_t> | ||
{ | ||
public: | ||
|
||
raw_encoder_t (size_t bufsize_, i_msg_source *msg_source_); | ||
~raw_encoder_t (); | ||
|
||
void set_msg_source (i_msg_source *msg_source_); | ||
|
||
private: | ||
|
||
bool raw_message_ready (); | ||
bool raw_message_size_ready (); | ||
|
||
i_msg_source *msg_source; | ||
msg_t in_progress; | ||
unsigned char tmpbuf [4]; | ||
raw_encoder_t (const raw_encoder_t&); | ||
const raw_encoder_t &operator = (const raw_encoder_t&); | ||
}; | ||
} | ||
|
||
#endif | ||
|
Oops, something went wrong.