7 #if !(defined(_WIN32) && defined(VRPN_USE_WINSOCK_SOCKETS)) 8 #include <netinet/in.h> 40 vrpn_int32 remote_port)
46 *length =
sizeof(vrpn_int32);
47 outbuf =
new char[*length];
53 nPort = htonl(remote_port);
54 memcpy(outbuf, &nPort,
sizeof(vrpn_int32));
61 const char *buffer, vrpn_int32 *remote_port)
65 if (!buffer || !remote_port)
return;
67 memcpy(&port, buffer,
sizeof(vrpn_int32));
68 *remote_port = ntohl(port);
73 vrpn_int32 *length, vrpn_int32 remote_port,
const char *service_name,
74 const char *message_type)
82 *length = static_cast<int>(3 *
sizeof(vrpn_int32) + strlen(service_name) +
83 strlen(message_type));
84 outbuf =
new char[*length];
96 nPort = htonl(remote_port);
97 nSLen = htonl(static_cast<vrpn_int32>(strlen(service_name)));
98 nTLen = htonl(static_cast<vrpn_int32>(strlen(message_type)));
99 memcpy(outbuf, &nPort,
sizeof(vrpn_int32));
100 memcpy(outbuf +
sizeof(vrpn_int32), &nSLen,
sizeof(vrpn_int32));
101 memcpy(outbuf + 2 *
sizeof(vrpn_int32), &nTLen,
sizeof(vrpn_int32));
102 strcpy(outbuf + 3 *
sizeof(vrpn_int32), service_name);
103 strcpy(outbuf + 3 *
sizeof(vrpn_int32) + strlen(service_name),
111 vrpn_int32 *remote_port,
121 if (!buffer || !remote_port || !message_type)
return;
126 memcpy(&port, buffer,
sizeof(vrpn_int32));
127 *remote_port = ntohl(port);
128 memcpy(&Slength, buffer +
sizeof(vrpn_int32),
sizeof(vrpn_int32));
129 Slength = ntohl(Slength);
130 Soutbuf =
new char[1 + Slength];
131 memcpy(&Tlength, buffer + 2 *
sizeof(vrpn_int32),
sizeof(vrpn_int32));
132 Tlength = ntohl(Tlength);
133 Toutbuf =
new char[1 + Tlength];
134 if (!Soutbuf || !Toutbuf) {
136 *service_name = NULL;
137 *message_type = NULL;
140 strncpy(Soutbuf, buffer + 3 *
sizeof(vrpn_int32), Slength);
141 Soutbuf[Slength] =
'\0';
142 *service_name = Soutbuf;
143 strncpy(Toutbuf, buffer + 3 *
sizeof(vrpn_int32) + Slength, Tlength);
144 Toutbuf[Tlength] =
'\0';
145 *message_type = Toutbuf;
150 , d_myForwarders(NULL)
194 if (fp->
port == remote_port) {
195 fprintf(stderr,
"vrpn_Forwarder_Server::start_remote_forwarding: " 196 "Already open on port %d.\n",
205 fp->
port = remote_port;
217 const char *service_name,
218 const char *message_type)
228 if (fp->
port == remote_port) it = fp;
232 "vrpn_Forwarder_Server: No forwarder open on port %d.\n",
242 fprintf(stderr,
"vrpn_Forwarder_Server: Couldn't forward messages of " 243 "type \"%s\" on port %d.\n",
244 message_type, remote_port);
269 if (!servicebuffer || !typebuffer)
return -1;
272 delete[] servicebuffer;
302 const char *service_name,
303 const char *message_type)
virtual int mainloop(const struct timeval *timeout=NULL)=0
Call each time through program main loop to handle receiving any incoming messages and sending any pa...
virtual int unregister_handler(vrpn_int32 type, vrpn_MESSAGEHANDLER handler, void *userdata, vrpn_int32 sender=vrpn_ANY_SENDER)
int forward(const char *sourceName, const char *sourceServiceName, const char *destinationName, const char *destinationServiceName, vrpn_uint32 classOfService=vrpn_CONNECTION_RELIABLE)
static char * encode_start_remote_forwarding(vrpn_int32 *length, vrpn_int32 remote_port)
virtual ~vrpn_Forwarder_Server(void)
const vrpn_uint32 vrpn_CONNECTION_RELIABLE
Classes of service for messages, specify multiple by ORing them together Priority of satisfying these...
virtual void mainloop(void)
virtual void start_remote_forwarding(vrpn_int32 remote_port)
virtual vrpn_int32 register_sender(const char *name)
Get a token to use for the string name of the sender or type. Remember to check for -1 meaning failur...
static char * encode_forward_message_type(vrpn_int32 *length, vrpn_int32 remote_port, const char *service_name, const char *message_type)
vrpn_Connection * d_connection
vrpn_Forwarder_Controller(vrpn_Connection *)
vrpn_int32 d_start_forwarding_type
static void decode_start_remote_forwarding(const char *buffer, vrpn_int32 *remote_port)
vrpn_Forwarder_Server(vrpn_Connection *)
class VRPN_API vrpn_ConnectionForwarder
virtual void forward_message_type(vrpn_int32 remote_port, const char *service_name, const char *message_type)
Generic connection class not specific to the transport mechanism.
virtual int register_handler(vrpn_int32 type, vrpn_MESSAGEHANDLER handler, void *userdata, vrpn_int32 sender=vrpn_ANY_SENDER)
Set up (or remove) a handler for a message of a given type. Optionally, specify which sender to handl...
vrpn_Forwarder_List * d_myForwarders
virtual ~vrpn_Forwarder_Brain(void)
vrpn_Forwarder_Brain(vrpn_Connection *)
This structure is what is passed to a vrpn_Connection message callback.
vrpn_ConnectionForwarder * forwarder
virtual int pack_message(vrpn_uint32 len, struct timeval time, vrpn_int32 type, vrpn_int32 sender, const char *buffer, vrpn_uint32 class_of_service)
Pack a message that will be sent the next time mainloop() is called. Turn off the RELIABLE flag if yo...
~vrpn_Forwarder_Controller(void)
virtual void start_remote_forwarding(vrpn_int32 remote_port)
#define vrpn_gettimeofday
vrpn_Forwarder_List * next
virtual void forward_message_type(vrpn_int32 remote_port, const char *service_name, const char *message_type)
vrpn_Connection * connection
vrpn_Connection * vrpn_create_server_connection(const char *cname, const char *local_in_logfile_name, const char *local_out_logfile_name)
Create a server connection of arbitrary type (VRPN UDP/TCP, TCP, File, Loopback, MPI).
void addReference()
Counting references to this connection.
vrpn_int32 d_forward_type
virtual vrpn_int32 register_message_type(const char *name)
static void decode_forward_message_type(const char *buffer, vrpn_int32 *remote_port, char **service_name, char **message_type)