1#ifndef VRPN_CONNECTION_H
2#define VRPN_CONNECTION_H
6#include "vrpn_Configure.h"
7#include "vrpn_Shared.h"
11#if !(defined(_WIN32) && defined(VRPN_USE_WINSOCK_SOCKETS))
12#include <sys/select.h>
19#pragma warning(disable : 4995 4996)
25enum vrpn_ConnectionStatus {
28 COOKIE_PENDING = (-1),
29 TRYING_TO_CONNECT = (-2),
44 struct timeval msg_time;
45 vrpn_int32 payload_len;
50typedef int(VRPN_CALLBACK *vrpn_MESSAGEHANDLER)(
void *userdata,
55typedef vrpn_MESSAGEHANDLER vrpn_LOGFILTER;
60const unsigned vrpn_ALIGN = 8;
67const int vrpn_CONNECTION_MAX_SENDERS = 2000;
68const int vrpn_CONNECTION_MAX_TYPES = 2000;
74const int vrpn_ANY_SENDER = -1;
79const int vrpn_ANY_TYPE = -1;
93const int vrpn_CONNECTION_TCP_BUFLEN = 64000;
94const int vrpn_CONNECTION_UDP_BUFLEN = 1472;
100const int vrpn_MAX_ENDPOINTS = 256;
104const vrpn_int32 vrpn_CONNECTION_SENDER_DESCRIPTION = (-1);
105const vrpn_int32 vrpn_CONNECTION_TYPE_DESCRIPTION = (-2);
106const vrpn_int32 vrpn_CONNECTION_UDP_DESCRIPTION = (-3);
107const vrpn_int32 vrpn_CONNECTION_LOG_DESCRIPTION = (-4);
108const vrpn_int32 vrpn_CONNECTION_DISCONNECT_MESSAGE = (-5);
118const vrpn_uint32 vrpn_CONNECTION_RELIABLE = (1 << 0);
119const vrpn_uint32 vrpn_CONNECTION_FIXED_LATENCY = (1 << 1);
120const vrpn_uint32 vrpn_CONNECTION_LOW_LATENCY = (1 << 2);
121const vrpn_uint32 vrpn_CONNECTION_FIXED_THROUGHPUT = (1 << 3);
122const vrpn_uint32 vrpn_CONNECTION_HIGH_THROUGHPUT = (1 << 4);
128const long vrpn_LOG_NONE = (0);
129const long vrpn_LOG_INCOMING = (1 << 0);
130const long vrpn_LOG_OUTGOING = (1 << 1);
141extern VRPN_API
const char *vrpn_got_first_connection;
142extern VRPN_API
const char *vrpn_got_connection;
143extern VRPN_API
const char *vrpn_dropped_connection;
144extern VRPN_API
const char *vrpn_dropped_last_connection;
153extern VRPN_API
const char *vrpn_CONTROL;
156const unsigned vrpn_CNAME_LENGTH = 100;
157typedef char vrpn_CNAME[vrpn_CNAME_LENGTH];
183 , numActiveEndpoints_(NULL)
188 vrpn_int32 *numActiveEndpoints = NULL)
191 , numActiveEndpoints_(numActiveEndpoints)
203 return (*epa_)(conn_, numActiveEndpoints_);
212 return (*epa_)(conn_, alternateNumActiveEndpoints);
216 vrpn_EndpointAllocator epa_;
218 vrpn_int32 *numActiveEndpoints_;
244class VRPN_API vrpn_TranslationTable;
245class VRPN_API vrpn_TypeDispatcher;
258 vrpn_int32 *connectedEndpointCounter);
270 virtual vrpn_bool doing_okay(
void)
const = 0;
278 virtual int mainloop(timeval *timeout) = 0;
289 int newLocalType(
const char *name, vrpn_int32 which);
295 vrpn_int32 local_id);
296 int newRemoteSender(vrpn_CNAME sender_name, vrpn_int32 remote_id,
297 vrpn_int32 local_id);
303 vrpn_int32 type, vrpn_int32 sender,
305 vrpn_uint32 class_of_service) = 0;
319 virtual void poll_for_cookie(
const timeval *timeout = NULL) = 0;
320 virtual int finish_new_connection_setup(
void) = 0;
361 void setLogNames(
const char *inName,
const char *outName);
369 static int VRPN_CALLBACK
371 static int VRPN_CALLBACK
383 virtual int dispatch(vrpn_int32 type, vrpn_int32 sender, timeval time,
384 vrpn_uint32 payload_len,
char *bufptr);
387 vrpn_uint32 len, timeval time, vrpn_int32 type,
388 vrpn_int32 sender,
const char *buffer,
389 vrpn_uint32 classOfService);
394 int marshall_message(
char *outbuf, vrpn_uint32 outbuf_size,
395 vrpn_uint32 initial_out, vrpn_uint32 len,
396 struct timeval time, vrpn_int32 type,
397 vrpn_int32 sender,
const char *buffer,
398 vrpn_uint32 sequenceNumber);
406 vrpn_TranslationTable *d_senders;
407 vrpn_TranslationTable *d_types;
409 vrpn_TypeDispatcher *d_dispatcher;
410 vrpn_int32 *d_connectionCounter;
427 vrpn_int32 *connectedEndpointCounter);
432 virtual vrpn_bool doing_okay(
void)
const;
437 vrpn_int32 tcp_outbuf_size(
void)
const;
438 vrpn_int32 udp_outbuf_size(
void)
const;
446 int mainloop(timeval *timeout);
452 int pack_message(vrpn_uint32 len,
struct timeval time, vrpn_int32 type,
453 vrpn_int32 sender,
const char *buffer,
454 vrpn_uint32 class_of_service);
462 int pack_udp_description(
int portno);
464 int handle_tcp_messages(
const timeval *timeout);
465 int handle_udp_messages(
const timeval *timeout);
467 int connect_tcp_to(
const char *msg);
480 void poll_for_cookie(
const timeval *timeout = NULL);
481 int finish_new_connection_setup(
void);
492 void setNICaddress(
const char *);
525 int getOneTCPMessage(
int fd,
char *buf,
size_t buflen);
526 int getOneUDPMessage(
char *buf,
size_t buflen);
528 vrpn_SOCKET d_udpOutboundSocket;
538 vrpn_int32 d_tcpBuflen;
539 vrpn_int32 d_udpBuflen;
540 vrpn_int32 d_tcpNumOut;
541 vrpn_int32 d_udpNumOut;
543 vrpn_int32 d_tcpSequenceNumber;
544 vrpn_int32 d_udpSequenceNumber;
547 d_tcpAlignedInbuf[vrpn_CONNECTION_TCP_BUFLEN /
sizeof(vrpn_float64) +
550 d_udpAlignedInbuf[vrpn_CONNECTION_UDP_BUFLEN /
sizeof(vrpn_float64) +
570 const char *local_out_logfile_name,
571 vrpn_EndpointAllocator epa = allocateEndpoint);
577 const char *local_out_logfile_name,
578 const char *remote_in_logfile_name,
579 const char *remote_out_logfile_name,
580 vrpn_EndpointAllocator epa = allocateEndpoint);
600 char **remote_in_logname,
char **remote_out_logname);
609 virtual int mainloop(
const struct timeval *timeout = NULL) = 0;
614 virtual vrpn_int32 register_message_type(
const char *name);
623 vrpn_int32 sender = vrpn_ANY_SENDER);
624 virtual int unregister_handler(vrpn_int32 type, vrpn_MESSAGEHANDLER handler,
626 vrpn_int32 sender = vrpn_ANY_SENDER);
631 vrpn_int32 type, vrpn_int32 sender,
632 const char *buffer, vrpn_uint32 class_of_service);
651 virtual const char *message_type_name(vrpn_int32 type);
691 d_stop_processing_messages_after = stop_looking_after;
693 vrpn_uint32 get_Jane_value(
void)
695 return d_stop_processing_messages_after;
712 vrpn_int32 *connectedEC);
717#pragma warning(disable : 4251)
738 static int VRPN_CALLBACK
740 static int VRPN_CALLBACK
745 void init(vrpn_EndpointAllocator
749 int compact_endpoints(
void);
757 virtual int do_callbacks_for(vrpn_int32 type, vrpn_int32 sender,
758 struct timeval time, vrpn_uint32 len,
771 void removeReference();
791 bool d_autoDeleteStatus;
815 vrpn_int32 d_serverLogMode;
816 char *d_serverLogName;
818 vrpn_bool d_updateEndpoint;
843 int port = vrpn_DEFAULT_LISTEN_PORT_NO,
844 const char *local_in_logfile_name = NULL,
845 const char *local_out_logfile_name = NULL,
846 const char *remote_in_logfile_name = NULL,
847 const char *remote_out_logfile_name = NULL,
848 const char *NIC_IPaddress = NULL,
849 vrpn_EndpointAllocator epa = allocateEndpoint);
856 unsigned short listen_port_no = vrpn_DEFAULT_LISTEN_PORT_NO,
857 const char *local_in_logfile_name = NULL,
858 const char *local_out_logfile_name = NULL,
859 const char *NIC_IPaddress = NULL,
861 vrpn_int32 *) = allocateEndpoint);
876 virtual int mainloop(
const struct timeval *timeout = NULL);
885 const char *cname,
const char *local_in_logfile_name,
886 const char *local_out_logfile_name,
const char *remote_in_logfile_name,
887 const char *remote_out_logfile_name,
const char *NIC_IPaddress,
888 bool force_connection);
891 const char *local_in_logfile_name,
892 const char *local_out_logfile_name);
901 static int VRPN_CALLBACK
917 server_check_for_incoming_connections(
const struct timeval *timeout = NULL);
961 virtual int mainloop(
const struct timeval *timeout = NULL);
964 virtual vrpn_bool
doing_okay(
void)
const {
return vrpn_true; }
969 virtual vrpn_bool
connected(
void)
const {
return vrpn_true; }
974 const char *local_in_logfile_name,
975 const char *local_out_logfile_name);
994 const char *cname,
const char *local_in_logfile_name = NULL,
995 const char *local_out_logfile_name = NULL,
996 const char *remote_in_logfile_name = NULL,
997 const char *remote_out_logfile_name = NULL,
998 const char *NIC_IPaddress = NULL,
bool force_reopen =
false);
1017vrpn_create_server_connection(
const char *cname,
1018 const char *local_in_logfile_name = NULL,
1019 const char *local_out_logfile_name = NULL);
1026vrpn_create_server_connection(
int port = vrpn_DEFAULT_LISTEN_PORT_NO,
1027 const char *local_in_logfile_name = NULL,
1028 const char *local_out_logfile_name = NULL,
1029 const char *NIC_NAME = NULL)
1032 if (NIC_NAME == NULL) {
1033 snprintf(name, 256,
":%d", port);
1036 snprintf(name, 256,
"%.200s:%d", NIC_NAME, port);
1038 return vrpn_create_server_connection(name, local_in_logfile_name,
1039 local_out_logfile_name);
1046VRPN_API
char *vrpn_copy_service_name(
const char *fullname);
1047VRPN_API
char *vrpn_copy_service_location(
const char *fullname);
1057VRPN_API
char *vrpn_copy_file_name(
const char *filespecifier);
1074VRPN_API
char *vrpn_copy_machine_name(
const char *hostspecifier);
1075VRPN_API
int vrpn_get_port_number(
const char *hostspecifier);
1076VRPN_API
char *vrpn_copy_rsh_program(
const char *hostspecifier);
1077VRPN_API
char *vrpn_copy_rsh_arguments(
const char *hostspecifier);
1081char *vrpn_set_service_name(
const char *specifier,
const char *newServiceName);
1088VRPN_API
int check_vrpn_cookie(
const char *buffer);
1089VRPN_API
int check_vrpn_file_cookie(
const char *buffer);
1094VRPN_API
size_t vrpn_cookie_size(
void);
1096VRPN_API
int write_vrpn_cookie(
char *buffer,
size_t length,
1097 long remote_log_mode);
1102#ifndef VRPN_USE_WINSOCK_SOCKETS
1104vrpn_noint_block_write(
int outfile,
const char buffer[],
size_t length);
1105int VRPN_API vrpn_noint_block_read(
int infile,
char buffer[],
size_t length);
1106int VRPN_API vrpn_noint_select(
int width, fd_set *readfds, fd_set *writefds,
1107 fd_set *exceptfds,
struct timeval *timeout);
1110vrpn_noint_block_write(vrpn_SOCKET outsock,
char *buffer,
size_t length);
1111int VRPN_API vrpn_noint_block_read(vrpn_SOCKET insock,
char *buffer,
size_t length);
1164 struct knownConnection {
1167 knownConnection *next;
1171 knownConnection *d_kcList;
1174 knownConnection *d_anonList;
Combines the function pointer for an Endpoint Allocator with its two arguments into a single callable...
定义 vrpn_Connection.h:178
return_type operator()(vrpn_int32 *alternateNumActiveEndpoints) const
Overload, with alternate num active connnection pointer.
定义 vrpn_Connection.h:207
return_type operator()() const
Default, fully pre-bound
定义 vrpn_Connection.h:198
Container for endpoints, held by pointer.
定义 vrpn_EndpointContainer.h:55
Singleton class that keeps track of all known VRPN connections and makes sure they're deleted on shut...
定义 vrpn_Connection.h:1137
void addConnection(vrpn_Connection *, const char *name)
static vrpn_ConnectionManager & instance(void)
The only way to get access to an instance of this class. Guarantees that there is only one,...
vrpn_Connection * getByName(const char *name)
vrpn_Connection_IP(unsigned short listen_port_no=vrpn_DEFAULT_LISTEN_PORT_NO, const char *local_in_logfile_name=NULL, const char *local_out_logfile_name=NULL, const char *NIC_IPaddress=NULL, vrpn_Endpoint_IP *(*epa)(vrpn_Connection *, vrpn_int32 *)=allocateEndpoint)
virtual int mainloop(const struct timeval *timeout=NULL)
void drop_connection_and_compact(vrpn_Endpoint *endpoint)
static int VRPN_CALLBACK handle_UDP_message(void *userdata, vrpn_HANDLERPARAM p)
Routines that handle system messages
vrpn_SOCKET listen_tcp_sock
TCP Connection requests come here
定义 vrpn_Connection.h:897
void init(void)
Called by all constructors
vrpn_uint32 d_stop_processing_messages_after
定义 vrpn_Connection.h:882
virtual void handle_connection(vrpn_Endpoint *endpoint)
friend VRPN_API 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).
virtual int send_pending_reports(void)
send pending report, clear the buffer.
vrpn_Connection_IP(const char *server_name, int port=vrpn_DEFAULT_LISTEN_PORT_NO, const char *local_in_logfile_name=NULL, const char *local_out_logfile_name=NULL, const char *remote_in_logfile_name=NULL, const char *remote_out_logfile_name=NULL, const char *NIC_IPaddress=NULL, vrpn_EndpointAllocator epa=allocateEndpoint)
friend VRPN_API vrpn_Connection * vrpn_get_connection_by_name(const char *cname, const char *local_in_logfile_name, const char *local_out_logfile_name, const char *remote_in_logfile_name, const char *remote_out_logfile_name, const char *NIC_IPaddress, bool force_connection)
Create a client connection of arbitrary type (VRPN UDP/TCP, TCP, File, Loopback, MPI).
vrpn_SOCKET listen_udp_sock
UDP Connect requests come here
定义 vrpn_Connection.h:896
virtual int connect_to_client(const char *machine, int port)
virtual void drop_connection(vrpn_Endpoint *endpoint)
Constructor for a Loopback connection that will basically just pass messages between objects that are...
定义 vrpn_Connection.h:943
virtual int mainloop(const struct timeval *timeout=NULL)
vrpn_Connection_Loopback()
virtual vrpn_bool doing_okay(void) const
Returns vrpn_true if the connection is okay, vrpn_false if not
定义 vrpn_Connection.h:964
virtual vrpn_bool connected(void) const
定义 vrpn_Connection.h:969
friend VRPN_API 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).
virtual int send_pending_reports(void)
send pending report, clear the buffer.
定义 vrpn_Connection.h:981
Generic connection class not specific to the transport mechanism.
定义 vrpn_Connection.h:562
vrpn_int32 d_numConnectedEndpoints
定义 vrpn_Connection.h:730
virtual int time_since_connection_open(struct timeval *elapsed_time)
virtual timeval get_time()
vrpn_Connection(const char *local_in_logfile_name, const char *local_out_logfile_name, const char *remote_in_logfile_name, const char *remote_out_logfile_name, vrpn_EndpointAllocator epa=allocateEndpoint)
vrpn::BoundEndpointAllocator d_boundEndpointAllocator
定义 vrpn_Connection.h:721
void addReference()
Counting references to this connection.
vrpn::EndpointContainer d_endpoints
定义 vrpn_Connection.h:725
virtual vrpn_bool doing_okay(void) const
Returns vrpn_true if the connection is okay, vrpn_false if not
virtual vrpn_int32 register_sender(const char *name)
static vrpn_Endpoint_IP * allocateEndpoint(vrpn_Connection *, vrpn_int32 *connectedEC)
void setAutoDeleteStatus(bool setvalue)
定义 vrpn_Connection.h:788
virtual vrpn_File_Connection * get_File_Connection(void)
virtual int pack_sender_description(vrpn_int32 which)
Send the sender description to ALL endpoints.
virtual void updateEndpoints(void)
virtual int register_log_filter(vrpn_LOGFILTER filter, void *userdata)
Sets up a filter function for logging. Any user message to be logged is first passed to this function...
vrpn_Connection(const char *local_in_logfile_name, const char *local_out_logfile_name, vrpn_EndpointAllocator epa=allocateEndpoint)
virtual int register_handler(vrpn_int32 type, vrpn_MESSAGEHANDLER handler, void *userdata, vrpn_int32 sender=vrpn_ANY_SENDER)
vrpn_uint32 d_stop_processing_messages_after
定义 vrpn_Connection.h:702
virtual vrpn_bool connected(void) const
virtual int send_pending_reports(void)=0
void get_log_names(char **local_in_logname, char **local_out_logname, char **remote_in_logname, char **remote_out_logname)
vrpn_TypeDispatcher * d_dispatcher
定义 vrpn_Connection.h:799
virtual int save_log_so_far()
Save any messages on any endpoints which have been logged so far.
void Jane_stop_this_crazy_thing(vrpn_uint32 stop_looking_after)
定义 vrpn_Connection.h:689
virtual int pack_message(vrpn_uint32 len, struct timeval time, vrpn_int32 type, vrpn_int32 sender, const char *buffer, vrpn_uint32 class_of_service)
virtual int pack_type_description(vrpn_int32 which)
Send the type description to ALL endpoints.
int d_serverLogCount
定义 vrpn_Connection.h:814
timeval start_time
Timekeeping - TCH 30 June 98
定义 vrpn_Connection.h:765
static int VRPN_CALLBACK handle_log_message(void *userdata, vrpn_HANDLERPARAM p)
Routines that handle system messages
virtual const char * sender_name(vrpn_int32 sender)
virtual int mainloop(const struct timeval *timeout=NULL)=0
int connectionStatus
Status of the connection
定义 vrpn_Connection.h:704
int message_type_is_registered(const char *) const
Returns message type ID, or -1 if unregistered
Encapsulation of the data and methods for a single IP-based connection to take care of one part of ma...
定义 vrpn_Connection.h:423
vrpn_SOCKET d_udpInboundSocket
定义 vrpn_Connection.h:529
char * d_remote_machine_name
Machine to call
定义 vrpn_Connection.h:514
int d_tcpListenPort
定义 vrpn_Connection.h:505
vrpn_bool outbound_udp_open(void) const
True if the UDP outbound is open, False if not.
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.
int d_remote_port_number
Port to connect to on remote machine
定义 vrpn_Connection.h:515
timeval d_last_connect_attempt
When the last UDP lob occurred
定义 vrpn_Connection.h:516
int setup_new_connection(void)
virtual int send_pending_reports(void)
send pending report, clear the buffer.
void drop_connection(void)
vrpn_SOCKET d_udpLobSocket
定义 vrpn_Connection.h:512
int connect_udp_to(const char *addr, int port)
vrpn_SOCKET d_tcpListenSocket
定义 vrpn_Connection.h:504
vrpn_bool d_tcp_only
定义 vrpn_Connection.h:518
vrpn_SOCKET d_tcpSocket
定义 vrpn_Connection.h:498
int connect_tcp_to(const char *addr, int port)
Encapsulation of the data and methods for a single generic connection to take care of one part of man...
定义 vrpn_Connection.h:254
char * d_remoteOutLogName
Name of the remote log file
定义 vrpn_Connection.h:346
int newLocalSender(const char *name, vrpn_int32 which)
int local_type_id(vrpn_int32 remote_type) const
Returns the local mapping for the remote type (-1 if none).
int local_sender_id(vrpn_int32 remote_sender) const
Returns the local mapping for the remote sender (-1 if none).
int pack_log_description(void)
Packs the log description set by setup_new_connection().
int tryToMarshall(char *outbuf, vrpn_int32 &buflen, vrpn_int32 &numOut, vrpn_uint32 len, timeval time, vrpn_int32 type, vrpn_int32 sender, const char *buffer, vrpn_uint32 classOfService)
long d_remoteLogMode
Mode to put the remote logging in
定义 vrpn_Connection.h:344
int pack_type_description(vrpn_int32 which)
Packs a type description.
int newRemoteType(vrpn_CNAME type_name, vrpn_int32 remote_id, vrpn_int32 local_id)
char * d_remoteInLogName
Name of the remote log file
定义 vrpn_Connection.h:345
void clear_other_senders_and_types(void)
virtual void clearBuffers(void)=0
virtual int pack_message(vrpn_uint32 len, struct timeval time, vrpn_int32 type, vrpn_int32 sender, const char *buffer, vrpn_uint32 class_of_service)=0
virtual int send_pending_reports(void)=0
virtual void drop_connection(void)=0
virtual int setup_new_connection(void)=0
int pack_sender_description(vrpn_int32 which)
Packs a sender description over our socket.
定义 vrpn_FileConnection.h:73
vrpn_LOGFILTER filter
routine to call
定义 vrpn_Connection.h:236
void * userdata
passed along
定义 vrpn_Connection.h:237
Description of a callback entry for a user type.
定义 vrpn_Connection.h:228
vrpn_int32 sender
Only if from sender
定义 vrpn_Connection.h:231
vrpnMsgCallbackEntry * next
Next handler
定义 vrpn_Connection.h:232
vrpn_MESSAGEHANDLER handler
Routine to call
定义 vrpn_Connection.h:229
void * userdata
Passed along
定义 vrpn_Connection.h:230
This structure is what is passed to a vrpn_Connection message callback.
定义 vrpn_Connection.h:41
Placed here so vrpn_FileConnection can use it too.
定义 vrpn_Connection.h:160