11 //---------------------------------------------------------------
13 //---------------------------------------------------------------
18 #include <sys/socket.h>
19 #include <arpa/inet.h>
21 #include <netinet/in.h>
22 #include <netinet/tcp.h>
27 #ifndef SOCKET_BUNDLE_H
28 #define SOCKET_BUNDLE_H
31 #define SERVER_SOCKET 1
32 #define CLIENT_SOCKET 2
37 /* buffer used to read from the sockets */
41 /* models a single socket connection */
42 struct socket_node_struct {
43 int endpoint; /* SERVER_SOCKET or CLIENT_SOCKET */
44 int addr_type; /* INET or UNIX */
46 int parent_id; /* if we're a new client for a server socket,
47 this points to the server socket we spawned from */
48 struct socket_node_struct* next;
50 typedef struct socket_node_struct socket_node;
53 /* Maintains the socket set */
54 struct socket_manager_struct {
55 /* callback for passing up any received data. sock_fd is the socket
56 that read the data. parent_id (if > 0) is the socket id of the
57 server that this socket spawned from (i.e. it's a new client connection) */
59 (void* blob, struct socket_manager_struct*,
60 int sock_fd, char* data, int parent_id);
62 void (*on_socket_closed) (void* blob, int sock_fd);
67 typedef struct socket_manager_struct socket_manager;
69 void socket_manager_free(socket_manager* mgr);
71 /* creates a new server socket node and adds it to the socket set.
72 returns socket id on success. -1 on failure.
73 socket_type is one of INET or UNIX */
74 int socket_open_tcp_server(socket_manager*, int port, char* listen_ip );
76 int socket_open_unix_server(socket_manager* mgr, char* path);
78 int socket_open_udp_server( socket_manager* mgr, int port, char* listen_ip );
80 /* creates a client TCP socket and adds it to the socket set.
81 returns 0 on success. -1 on failure. */
82 int socket_open_tcp_client(socket_manager*, int port, char* dest_addr);
84 /* creates a client UNIX socket and adds it to the socket set.
85 returns 0 on success. -1 on failure. */
86 int socket_open_unix_client(socket_manager*, char* sock_path);
88 int socket_open_udp_client( socket_manager* mgr, int port, char* dest_addr);
90 /* returns the socket_node with the given sock_fd */
91 socket_node* socket_find_node(socket_manager*, int sock_fd);
93 /* removes the node with the given sock_fd from the list and frees it */
94 void socket_remove_node(socket_manager*, int sock_fd);
97 /* sends the given data to the given socket. returns 0 on success, -1 otherwise */
98 int socket_send(int sock_fd, const char* data);
101 int _socket_send(int sock_fd, const char* data, int flags);
104 /* sends the given data to the given socket.
105 * sets the send flag MSG_DONTWAIT which will allow the
106 * process to continue even if the socket buffer is full
107 * returns 0 on success, -1 otherwise */
108 int socket_send_nowait( int sock_fd, const char* data);
110 /* waits at most usecs microseconds for the socket buffer to
112 int socket_send_timeout( int sock_fd, const char* data, int usecs );
114 /* disconnects the node with the given sock_fd and removes
115 it from the socket set */
116 void socket_disconnect(socket_manager*, int sock_fd);
118 /* allocates and inserts a new socket node into the nodeset.
119 if parent_id is positive and non-zero, it will be set */
120 socket_node* _socket_add_node(socket_manager* mgr,
121 int endpoint, int addr_type, int sock_fd, int parent_id );
123 /* XXX This only works if 'sock_fd' is a client socket... */
124 int socket_wait(socket_manager* mgr, int timeout, int sock_fd);
126 /* waits on all sockets for incoming data.
127 timeout == -1 | block indefinitely
128 timeout == 0 | don't block, just read any available data off all sockets
129 timeout == x | block for at most x seconds */
130 int socket_wait_all(socket_manager* mgr, int timeout);
132 /* iterates over the sockets in the set and handles active sockets.
133 new sockets connecting to server sockets cause the creation
134 of a new socket node.
135 Any new data read is is passed off to the data_received callback
137 int _socket_route_data(socket_manager* mgr, int num_active, fd_set* read_set);
139 /* routes data from a single known socket */
140 int _socket_route_data_id( socket_manager* mgr, int sock_id);
142 /* utility function for displaying the currently attached sockets */
143 void _socket_print_list(socket_manager* mgr);
145 int socket_connected(int sock_fd);
148 int _socket_handle_new_client(socket_manager* mgr, socket_node* node);
149 int _socket_handle_client_data(socket_manager* mgr, socket_node* node);