Worklog for Flanker

UDP Network library

Return to Worklogs

Current version and documentation(Posted 2016-01-17)
Last and current version of the library : v1.12

LIBRARY INFOS :
This library is designed to replace Blitz3D native DirectPlay commands as it is depreciated in newer Windows version. The UDP network library only uses UDP protocol for fast packets delivery, but this doesn't guarantee arrival or order of packets instead of TCP protocol. It includes automatic server switch if the main server quits and constant ping-pong from server to clients to check for timeouts. With the help on the forums, I try to make it easy to use but powerful and reliable.

Thanks to Rick Nasher and Guy Fawkes for testing and suggestions.
Thanks to stayne for mapping a level to test the library in good conditions.
Thanks to RemiD for discussions about server/client managment.


DOCUMENTATION :
First of all, the library uses variables with "net_" prefix, and functions with "Net_" prefix, be aware with your own variables and functions.

Available functions :

Net_StartInput()
A basic prompt input console to host a server or join an existing one. Returns 2 if server is created, or 1 if the designated server is reachable. Returns 0 if an error occured.

Net_HostServer(port)
You can override the prompt console and directly create a server on designated port (returns 2 if server created, 0 if not). Avoid to use port 0, as a random available port will be used instead.

Net_JoinServer(ip$,port)
You can override the prompt console and directly join a server at designated ip and port (returns 1 if server is reachable, 0 if not). Ip must be in string dotted format (x.x.x.x).

Net_StopNetwork()
Just properly stops the current server or client session, and reset it to default state.

Net_CreatePlayer(name$)
Creates the LOCAL player with the designated name (ie. the player of THIS computer, this is not used to create other players). This must be called once and only once after you created or joined a session.

Net_RequestPlayer(id)
Used by clients to ask the server informations about a player ID. This can be useful if you received a message from a ID you don't know, because with UDP protocol, packets may not arrive (or eventually arrive in any order), so you can miss a new player "100" message. This will force the server to resend you that message with proper informations.

Net_KickPlayer(name$)
Kicks the player with the designated name if you are the server.

Net_CheckMessage()
Call this function often to check if a new message has arrived. It returns 1 if a message if available. If so, the variables Net_MsgTyp, Net_MsgFrom, Net_MsgTo and Net_MsgString will automatically be filled with appropriate data.

Net_SendMessage(typ,message$="",sender=0,recipient=0)
Sends a message to the server or connected clients. This is the function you will use to update your network.
- typ is a number (from 1 to 99) you will use to know what kind of message it is. For example, 1 will be chat message, 2 will be player position... it's up to you. You may write message type from 1 to 99 for you needs.
- message$ is a string to join to the message. You can use it to send chat message or even data stripped with / for example.
- sender is the ID of the player who sent the message. When you send a message, you don't need to fill it, it's automatic.
- recipient is the recipient of the message, or 0 if everyone have to receive it. If you don't fill it, it will be 0 (=broadcast)
NOTE : a message with recipient = 0 (broadcast), won't be sent to the sender player. You can force it by filling the recipient with the sender ID.


Available variables :

Net_MsgType : Integer - The identification type of the last received message.
Net_MsgFrom : Integer - The ID of the player who sent the message.
Net_MsgTo : Integer - The ID of the player who has to receive the message (or 0 if broadcast to everyone).
Net_MsgString : String - The message string or data string received with the packet.

Also, the library uses standard message types you will find useful :
- 100 : tells that a new player has joined (use Net_MsgString to get the name, and Net_MsgFrom to get the ID).
- 101 : tells a player has quit (use Net_MsgString to get the name, and Net_MsgFrom to get the ID).
- 102 : the host has changed, the new host ID can be read with Net_MsgFrom.
- 103 : ping update (read the ping in Net_MsgString and the player ID in Net_MsgFrom).
- 200 : fatal exception, if you receive that, something went wrong...


Library parameters :

net_timeOut : Integer - The time in milliseconds before the connection closes when we don't receive any new packets (timeout).

net_autoRouteMessages : Boolean - Tells if the server has to automatically route clients messages to other clients.
If set to True, when a client sends a message to the server, the server automatically send it to all other clients.
If set to False, the server won't route any received message to other clients, so you can, for example check for cheats, correct the packet, ignore it etc... server side.

net_autoSwitchHost : Boolean - Allows the server to switch to another player if it quits (the new host will be the most ancient connected player). Check for message type 102 to see when it happens.

net_defaultPort : Integer - The default port used by the library if you don't fill a port in the input console. Port must be in the range 0-65535.


Send binary data :
Since v1.1, you can append binary data to your messages very easily.
You can use the functions Net_WriteByte(byte), Net_WriteShort(short), Net_WriteInt(int), Net_WriteFloat(float), Net_WriteString(string) to write what you want to your message.
You will have to do that just before you use the SendMessage() command.
To read binary data back from a message, use the functions Net_ReadByte(), Net_ReadShort(), Net_ReadInt(), Net_ReadFloat(), Net_ReadString(), in the same order you wrote the data.
See the examples for more infos.


LIBRARY CODE :

Name it "UDPNetwork_lib.bb" and include it in your game code.

SIMPLE 2D EXAMPLE (TUTORIAL) :

This example is quite simple. It can be a kind of a tutorial to start to use the library. It's fully commented so it seems to be big, but the code itself is not ! :-)

ADVANCED 3D EXAMPLE :

This is an advanced example I try to improve each time to see what we can get with the library.
Each player sends his position to the server at a constant rate. Beetween position packets, linear interpolation is done to position the players smoothly.
Also, I finally use tweening in the main loop, so the game logic is updated at a constant rate, but the network is updated outside tweening, as fast as possible to reduce the ping.


Version 1.12(Posted 2016-01-12)
CURRENT VERSION

- modified the connection procedure according to issues we found online recently
- added function Net_RequestPlayer(id) for a player to request infos about another player
-> for example, if we receive a packet from a player we didn't create yet (because UDP can never arrive, or in disorder), then the server will resend us the infos ID/name of the player in a "100" message (new player)
- IDs and packets modified to accept up to 65535 players, yes, optimistic :) but it also allow the random ID generation to have less chance to find an ID that already exists


Version 1.11(Posted 2016-01-11)
OBSOLETE VERSION

Just a little update to the v1.11 but quite important :

- fixed a coding issue with ping causing weird effects
- added some protection from outside


Version 1.1(Posted 2016-01-11)
OBSOLETE VERSION

Changes :
- Variable "net_switchHost" renamed To "net_autoSwitchHost"
- Added variable "net_autoRouteMessages" to make the server act as a router or not
- Added constant ping-pong from server to players to check timeouts
- Added client side verification of connection timeout
- Function Net_StartInput() modified to save time for local testing
- Added variable "net_defaultPort" to specify the port to use by default
- Number of clients is now limited to 255, so instead of sending 8 bytes (2 integers ID, sender/recipient) in each packets we only send 2 bytes
- Packets structure modified to make easier the implementation of bytes writing -> Typ/Sender/Recipient/Message/Data
- Added functions to easily write/read binary data in a packet
- Variable Net_MsgData renamed to Net_MsgString to avoid confusion with binary data
- Reinforced protection from outside (non connected clients) and inside (so a client can't steal the identity of another client, and can't send a message to himself) [WIP]
- enough for this first major update :)


Version 1.0(Posted 2015-12-26)
OBSOLETE VERSION

In this first version, the server acts as a router, so when a client sends a packet to the server, it is automatically forwarded to all other clients (fast and simple). The library is easy to use with very few commands. The code structure is reliable for future development.