about summary refs log tree commit diff
path: root/src/engine/network.h
diff options
context:
space:
mode:
authorMagnus Auvinen <magnus.auvinen@gmail.com>2007-07-13 13:40:04 +0000
committerMagnus Auvinen <magnus.auvinen@gmail.com>2007-07-13 13:40:04 +0000
commit125d04e51f4e444a38cf038d3ea095d92d3c6dbb (patch)
tree2288bbe4b923ab4d695e9f852c177a12f74ea799 /src/engine/network.h
parent7be0ae1b2929a3c5dfedf542bce886deefa0f862 (diff)
downloadzcatch-125d04e51f4e444a38cf038d3ea095d92d3c6dbb.tar.gz
zcatch-125d04e51f4e444a38cf038d3ea095d92d3c6dbb.zip
large rewrite and code cleanup
Diffstat (limited to 'src/engine/network.h')
-rw-r--r--src/engine/network.h104
1 files changed, 104 insertions, 0 deletions
diff --git a/src/engine/network.h b/src/engine/network.h
new file mode 100644
index 00000000..de035888
--- /dev/null
+++ b/src/engine/network.h
@@ -0,0 +1,104 @@
+
+struct NETPACKET
+{
+	// -1 means that it's a stateless packet
+	// 0 on the client means the server
+	int client_id;
+	NETADDR4 address; // only used when client_id == -1
+	int flags;
+	int data_size;
+	const void *data;
+};
+
+struct NETSTATS
+{
+	int send_bytes;
+	int recv_bytes;
+	int send_packets;
+	int recv_packets;
+	
+	int resend_packets;
+	int resend_bytes;
+};
+
+struct NETSERVER;
+struct NETCLIENT;
+
+enum
+{
+	NETFLAG_ALLOWSTATELESS=1,
+	PACKETFLAG_VITAL=1,
+	
+	NETSTATE_OFFLINE=0,
+	NETSTATE_CONNECTING,
+	NETSTATE_ONLINE,
+};
+
+// server side
+NETSERVER *net_server_open(int port, int max_clients, int flags);
+int net_server_recv(NETSERVER *s, NETPACKET *packet);
+int net_server_send(NETSERVER *s, NETPACKET *packet);
+int net_server_close(NETSERVER *s);
+int net_server_update(NETSERVER *s);
+int net_server_drop(NETSERVER *s, int client_id, const char *reason);
+int net_server_newclient(NETSERVER *s); // -1 when no more, else, client id
+int net_server_delclient(NETSERVER *s); // -1 when no more, else, client id
+void net_server_stats(NETSERVER *s, NETSTATS *stats);
+
+// client side
+NETCLIENT *net_client_open(int flags);
+int net_client_disconnect(NETCLIENT *c, const char *reason);
+int net_client_connect(NETCLIENT *c, NETADDR4 *addr);
+int net_client_recv(NETCLIENT *c, NETPACKET *packet);
+int net_client_send(NETCLIENT *c, NETPACKET *packet);
+int net_client_close(NETCLIENT *c);
+int net_client_update(NETCLIENT *c);
+int net_client_state(NETCLIENT *c);
+void net_client_stats(NETCLIENT *c, NETSTATS *stats);
+
+
+// wrapper classes for c++
+#ifdef __cplusplus
+class net_server
+{
+	NETSERVER *ptr;
+public:
+	net_server() : ptr(0) {}
+	~net_server() { close(); }
+	
+	int open(int port, int max, int flags) { ptr = net_server_open(port, max, flags); return ptr != 0; }
+	int close() { int r = net_server_close(ptr); ptr = 0; return r; }
+	
+	int recv(NETPACKET *packet) { return net_server_recv(ptr, packet); }
+	int send(NETPACKET *packet) { return net_server_send(ptr, packet); }
+	int update() { return net_server_update(ptr); }
+	
+	int drop(int client_id, const char *reason) { return net_server_drop(ptr, client_id, reason); } 
+	int newclient() { return net_server_newclient(ptr); }
+	int delclient() { return net_server_delclient(ptr); }
+	
+	void stats(NETSTATS *stats) { net_server_stats(ptr, stats); }
+};
+
+
+class net_client
+{
+	NETCLIENT *ptr;
+public:
+	net_client() : ptr(0) {}
+	~net_client() { close(); }
+	
+	int open(int flags) { ptr = net_client_open(flags); return ptr != 0; }
+	int close() { int r = net_client_close(ptr); ptr = 0; return r; }
+	
+	int connect(NETADDR4 *addr) { return net_client_connect(ptr, addr); }
+	int disconnect(const char *reason) { return net_client_disconnect(ptr, reason); }
+	
+	int recv(NETPACKET *packet) { return net_client_recv(ptr, packet); }
+	int send(NETPACKET *packet) { return net_client_send(ptr, packet); }
+	int update() { return net_client_update(ptr); }
+	
+	int state() { return net_client_state(ptr); }
+	void stats(NETSTATS *stats) { net_client_stats(ptr, stats); }
+};
+#endif