renet 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/README ADDED
@@ -0,0 +1,81 @@
1
+ =================================================
2
+ rENet
3
+ Ruby library for games networking
4
+ -------------------------------------------------
5
+ -= Work in Progress =-
6
+ No docs or comments right now :|
7
+ Just this readme ;x
8
+ =================================================
9
+
10
+ Planned:
11
+ - ENet::Connection (client)
12
+ - ENet::Server (server)
13
+ - Others
14
+
15
+ More or less finished:
16
+ - ENet::Connection
17
+ - ENet::Server
18
+
19
+ -------------------------------------------------
20
+ Available binaries:
21
+ - Ruby 1.9 Windows 32bits (Mingw)
22
+
23
+ =================================================
24
+ Under MIT license
25
+ ------------------------------------------------
26
+ Uses ENet as backend < http://enet.bespin.org/ >
27
+ =================================================
28
+
29
+ Library overview
30
+ -------------------------------------------------
31
+ module ENet
32
+ |- ENET_VERSION (string)
33
+ |- RENET_VERSION (string)
34
+ |
35
+ |- Connection (class)
36
+ | |- attr_reader
37
+ | | |- online?
38
+ | | |- connected?
39
+ | |
40
+ | |- attr_accessor
41
+ | | |- total_sent_data
42
+ | | |- total_received_data
43
+ | | |- total_sent_packets
44
+ | | |- total_received_packets
45
+ | |
46
+ | |- methods
47
+ | |- initialize (remote host, remote port, channels to allocate, download bw, upload bw)
48
+ | |- connect (timeout in ms)
49
+ | |- disconnect (timeout in ms)
50
+ | |- send_packet (data to send, reliable or not, channel id)
51
+ | |- send_queued_packets (nothing)
52
+ | |- flush (nothing)
53
+ | |- update (timeout in ms)
54
+ | |- use_compression (true or false)
55
+ | |- on_connection (method to call)
56
+ | |- on_packet_receive (method to call)
57
+ | |- on_disconnection (method to call)
58
+ |
59
+ |- Server (class)
60
+ |- attr_reader
61
+ | |- max_clients
62
+ | |- clients_count
63
+ |
64
+ |- attr_accessor
65
+ | |- total_sent_data
66
+ | |- total_received_data
67
+ | |- total_sent_packets
68
+ | |- total_received_packets
69
+ |
70
+ |- methods
71
+ |- initialize (local port, n� of allowed clients, channels to allocate, download bw, upload bw)
72
+ |- disconnect_client (client id)
73
+ |- send_packet (client id, data to send, reliable or not, channel id)
74
+ |- broadcast_packet (data to send, reliable or not, channel id)
75
+ |- send_queued_packets (nothing)
76
+ |- flush (nothing)
77
+ |- update (timeout in ms)
78
+ |- use_compression (true or false)
79
+ |- on_connection (method to call)
80
+ |- on_packet_receive (method to call)
81
+ |- on_disconnection (method to call)
@@ -0,0 +1,47 @@
1
+ # require the lib!
2
+ require './../bin/renet'
3
+
4
+ # define a custom handler for new client connections, it will be automatically called
5
+ def connections_handler(id, ip)
6
+ # show who connected
7
+ puts "[ID #{id}] connected from #{ip}"
8
+ # delete the hash entry if it already exists
9
+ @clients.delete_if {|key, value| key == id }
10
+ # add the new entry to the clients hash
11
+ @clients[id] = { :ip => ip }
12
+ #show how many clients we have
13
+ puts "Clients connected: #{@server.clients_count} of #{@server.max_clients}"
14
+ end
15
+
16
+ # define a custom handler for incoming data packets, it will be automatically called
17
+ def packets_handler(id, data, channel)
18
+ # show who sent the packet, the data inside and the channel used
19
+ puts "packet from [peer #{id}] -> [#{data}] - [#{channel}]"
20
+ # answer sending the same data to the client (client ID, data, reliable or not, channel ID)
21
+ @server.send_packet(id, data, true, channel)
22
+ end
23
+
24
+ # define a custom handler for client disconnections, it will be automatically called
25
+ def disconnections_handler(id)
26
+ # show who left
27
+ puts "#{@clients[id][:ip]} with ID #{id} disconnected"
28
+ # delete its entry in the clients hash
29
+ @clients.delete_if {|key, value| key == id }
30
+ # sends a packet to all clients informing about the disconnection (data, reliable or not, channel ID)
31
+ @server.broadcast_packet("#{id} disconnected", true, 1)
32
+ end
33
+ # create a hash to store clients information
34
+ @clients = {}
35
+ # create a new server object ( port, clients allowed, number of channels, download bandwidth, upload badnwidth)
36
+ @server = ENet::Server.new(8000, 32, 2, 0, 0)
37
+
38
+ # Set our handlers to the server
39
+ @server.on_connection(method(:connections_handler))
40
+ @server.on_packet_receive(method(:packets_handler))
41
+ @server.on_disconnection(method(:disconnections_handler))
42
+
43
+ # loop forever
44
+ loop do
45
+ # send queued packets and wait for new packets 1000 milliseconds
46
+ @server.update(1000)
47
+ end
@@ -0,0 +1,71 @@
1
+ # require gosu and renet libs!
2
+ require 'gosu'
3
+ require './../bin/renet'
4
+
5
+ # define a new window class
6
+ class GameWindow < Gosu::Window
7
+ def initialize
8
+ super(640, 480, false)
9
+ # set a descriptive caption
10
+ self.caption = "Gosu & ENet Test"
11
+ # create a font to draw the information
12
+ @font = Gosu::Font.new(self, Gosu::default_font_name, 20)
13
+ # create a new connection object (remote host address, remote host port, channels, download bandwidth, upload bandwidth)
14
+ @socket = ENet::Connection.new("localhost", 8000, 2, 0, 0)
15
+ # set the handler for the packets
16
+ @socket.on_packet_receive(method(:on_packet))
17
+ # an array to store the incoming packets
18
+ @packets = []
19
+ end
20
+
21
+ def update
22
+ # send queued packets and receive incoming ones (0 = non-blocking)
23
+ @socket.update(0)
24
+ # show our client FPS
25
+ self.caption = "Gosu & ENet Test - [FPS: #{Gosu::fps.to_s}]"
26
+ end
27
+
28
+ def draw
29
+ # show if we are connected to the server or not (@socket.connected? is valid too)
30
+ @font.draw("Connected: #{@socket.online?}", 10, 10, 0, 1.0, 1.0, 0xffffff00)
31
+ # show the controls
32
+ @font.draw("Press C to connect Press P to send a packet", 10, 440, 0, 1.0, 1.0, 0xffffff00)
33
+ # Show the socket information
34
+ @font.draw("Packets Sent: #{@socket.total_sent_packets}", 450, 380, 0, 1.0, 1.0, 0xffffff00)
35
+ @font.draw("Packets Recv: #{@socket.total_received_packets}", 450, 400, 0, 1.0, 1.0, 0xffffff00)
36
+ @font.draw("Bytes Sent: #{@socket.total_sent_data}", 450, 420, 0, 1.0, 1.0, 0xffffff00)
37
+ @font.draw("Bytes Recv: #{@socket.total_received_data}", 450, 440, 0, 1.0, 1.0, 0xffffff00)
38
+
39
+ # show the storaged packets
40
+ if !@packets.empty?
41
+ @packets.each_index do |i|
42
+ @font.draw("[PACKET] From channel #{@packets[i][1]}, containing \"#{@packets[i][0]}\"", 10, 30*(i+1), 0, 1.0, 1.0, @packets[i][2])
43
+ end
44
+ end
45
+ end
46
+
47
+ def button_down(id)
48
+ case id
49
+ # connect to the server if we press C
50
+ when Gosu::KbC
51
+ # only connects if we are not already connected
52
+ @socket.connect(2000)
53
+ # send a packet if we press P
54
+ when Gosu::KbP
55
+ # send a packet to the server (data, reliable or not, channel ID)
56
+ @socket.send_packet("test packet", true, 0)
57
+ end
58
+ end
59
+
60
+ # define a custom handler to manage the packets
61
+ def on_packet(data, channel)
62
+ # delete the old packets if we get more than 10
63
+ @packets.slice!(0) if @packets.size >= 11
64
+ #storage the packet data, channel and a representative color
65
+ @packets << [data, channel, Gosu::Color.argb(255, rand(100)+155, rand(100)+155, rand(100)+155)]
66
+ end
67
+ end
68
+
69
+ # show the window
70
+ window = GameWindow.new
71
+ window.show
@@ -0,0 +1,47 @@
1
+ /**
2
+ @file callbacks.c
3
+ @brief ENet callback functions
4
+ */
5
+ #define ENET_BUILDING_LIB 1
6
+ #include "enet/enet.h"
7
+
8
+ static ENetCallbacks callbacks = { malloc, free, abort };
9
+
10
+ int
11
+ enet_initialize_with_callbacks (ENetVersion version, const ENetCallbacks * inits)
12
+ {
13
+ if (version < ENET_VERSION_CREATE (1, 3, 0))
14
+ return -1;
15
+
16
+ if (inits -> malloc != NULL || inits -> free != NULL)
17
+ {
18
+ if (inits -> malloc == NULL || inits -> free == NULL)
19
+ return -1;
20
+
21
+ callbacks.malloc = inits -> malloc;
22
+ callbacks.free = inits -> free;
23
+ }
24
+
25
+ if (inits -> no_memory != NULL)
26
+ callbacks.no_memory = inits -> no_memory;
27
+
28
+ return enet_initialize ();
29
+ }
30
+
31
+ void *
32
+ enet_malloc (size_t size)
33
+ {
34
+ void * memory = callbacks.malloc (size);
35
+
36
+ if (memory == NULL)
37
+ callbacks.no_memory ();
38
+
39
+ return memory;
40
+ }
41
+
42
+ void
43
+ enet_free (void * memory)
44
+ {
45
+ callbacks.free (memory);
46
+ }
47
+
@@ -0,0 +1,27 @@
1
+ /**
2
+ @file callbacks.h
3
+ @brief ENet callbacks
4
+ */
5
+ #ifndef __ENET_CALLBACKS_H__
6
+ #define __ENET_CALLBACKS_H__
7
+
8
+ #include <stdlib.h>
9
+
10
+ typedef struct _ENetCallbacks
11
+ {
12
+ void * (ENET_CALLBACK * malloc) (size_t size);
13
+ void (ENET_CALLBACK * free) (void * memory);
14
+ void (ENET_CALLBACK * no_memory) (void);
15
+ } ENetCallbacks;
16
+
17
+ /** @defgroup callbacks ENet internal callbacks
18
+ @{
19
+ @ingroup private
20
+ */
21
+ extern void * enet_malloc (size_t);
22
+ extern void enet_free (void *);
23
+
24
+ /** @} */
25
+
26
+ #endif /* __ENET_CALLBACKS_H__ */
27
+