Simon Gust
Member
Hello,
Having a problem with networking I decided to look into.
Problems with TCP:
- server steals packets it sends to the client and claims them for itself offsetting the buffer seek and causing errors.
Problems with UPD:
- Once the client sends a packet, the server will read that packet forever every step. The buffer does not seem to be illegal long after the client hasn't sent anything.
- The client anwsers his own network_send_udp() making the async event trigger everytime, however when asked who's socket is sending, it says that it isn't it's own socket. The test was made with the server unable to send any packets.
TCP
UDP
Having a problem with networking I decided to look into.
Problems with TCP:
- server steals packets it sends to the client and claims them for itself offsetting the buffer seek and causing errors.
Problems with UPD:
- Once the client sends a packet, the server will read that packet forever every step. The buffer does not seem to be illegal long after the client hasn't sent anything.
- The client anwsers his own network_send_udp() making the async event trigger everytime, however when asked who's socket is sending, it says that it isn't it's own socket. The test was made with the server unable to send any packets.
TCP
server create
server async
server step
client create
client async
client step
Code:
tick = 0;
port = 6510;
writePing = 0;
serverID = network_create_server(network_socket_tcp, port, 12);
while (serverID < 0 && port < 65535)
{
port++
serverID = network_create_server(network_socket_tcp, port, 12);
}
socketList = ds_list_create();
Code:
var SID = async_load[? "id"];
if (SID == serverID)
{
show_debug_message("client update");
var type = async_load[? "type"];
switch(type)
{
case network_type_connect:
{
var cSocketID = async_load[? "socket"];
addClient(cSocketID);
}
break;
case network_type_disconnect:
{
var cSocketID = async_load[? "socket"];
delClient(cSocketID);
}
break;
}
}
else
{
var cBufferID = async_load[? "buffer"];
if (cBufferID < 0)
{
show_debug_message("buffer illegal");
exit;
}
show_debug_message("server new data");
buffer_seek(cBufferID, 0, 0);
var messageID = buffer_read(cBufferID, buffer_u8);
switch (messageID)
{
case CMD.PING:
{
// read ping
var ping = current_time - writePing;
show_debug_message("ping: " + string(ping));
}
}
}
Code:
tick++;
// send ping
if (tick mod 90 == 0)
{
writePing = current_time;
show_debug_message("server ask ping");
var sBufferID = buffer_create(256, buffer_grow, 1);
buffer_seek(sBufferID, buffer_seek_start, 0);
buffer_write(sBufferID , buffer_u8, CMD.PING);
// send to all clients
var size = ds_list_size(socketList);
for (var i = 0; i < size; i++)
{
var sock = socketList[| i];
var ip = "127.0.0.1";
var send = network_send_packet(sock, sBufferID, buffer_tell(sBufferID));
if (send < 0) show_debug_message("server ask ping failed");
}
// free memory
buffer_delete(sBufferID);
}
Code:
cSocketID = network_create_socket(network_socket_tcp);
while (cSocketID < 0)
{
cSocketID = network_create_socket(network_socket_tcp);
}
port = 0;
var con = network_connect(cSocketID, "127.0.0.1", port);
while (con < 0)
{
port++;
con = network_connect(cSocketID, "127.0.0.1", port);
}
// client map
clientMap = ds_map_create();
returnPing = false;
Code:
var SID = async_load[? "id"];
if (SID == cSocketID)
{
show_debug_message("client new message");
var sBufferID = async_load[? "buffer"];
if (sBufferID < 0)
{
show_debug_message("buffer illegal");
exit;
}
buffer_seek(sBufferID, 0, 0);
var type = buffer_read(sBufferID, buffer_u8);
switch (type)
{
case CMD.PING:
{
// anwser ping
show_debug_message("client return ping");
returnPing = true;
}
break;
case CMD.ADDCLIENT:
{
// get socketID
show_debug_message("add client called");
var sock = buffer_read(sBufferID, buffer_u16);
// add to client map
var inst = instance_create(60, 60, obj_player_client);
inst.socketID = sock;
socketMap[? sock] = inst;
}
break;
case CMD.DELCLIENT:
{
// get socketID
show_debug_message("del client called");
var sock = buffer_read(sBufferID, buffer_u16);
// add to client map
var inst = socketMap[? sock];
with (inst) instance_destroy();
}
break;
}
}
Code:
if (returnPing)
{
show_debug_message("client writing ping");
var cBufferID = buffer_create(256, buffer_grow, 1);
buffer_seek(cBufferID, 0, 0);
buffer_write(cBufferID , buffer_u8, CMD.PING);
// send to server
var send = network_send_packet(cSocketID, cBufferID, buffer_tell(cBufferID));
if (send < 0) show_debug_message("client return ping failed");
// free memory
buffer_delete(cBufferID);
returnPing = false;
}
UDP
server create
server async
client create
client async
client step
Code:
tick = 0;
var type = network_socket_udp;
var port = 8000;
sSocketID = network_create_socket_ext(type, port);
remotePort = 0;
remoteIP = "0.0.0.0";
var size = 1024;
var type = buffer_fixed;
sBufferID = buffer_create(size, type, 1);
Code:
//Get the port and ip of the client
remotePort = async_load[? "port"];
remoteIP = string(async_load[? "ip"]);
// get buffer
var cBufferID = async_load[? "buffer"];
buffer_seek(cBufferID, 0, 0);
// read buffer
var type = buffer_read(cBufferID, buffer_u8);
switch (type)
{
case CMD.PING:
{
// return ping
show_debug_message("return ping");
buffer_seek(sBufferID, 0, 0);
buffer_write(sBufferID, buffer_u8, CMD.PING);
var send = network_send_udp(sSocketID, remoteIP, remotePort, sBufferID, buffer_tell(sBufferID));
if (send < 0) show_debug_message("packet lost");
}
break;
}
Code:
readPing = 0;
tick = 0;
cSocketID = network_create_socket(network_socket_udp);
remoteIP = "127.0.0.1";
remotePort = 8000;
var size = 1024;
var type = buffer_fixed;
cBufferID = buffer_create(size, type, 1);
Code:
//check for data
var sBufferID = async_load[? "buffer"];
buffer_seek(sBufferID, buffer_seek_start, 0);
// read
var type = buffer_read(sBufferID, buffer_u8);
switch (type)
{
case CMD.PING:
{
// seek ping
var ping = current_time - readPing;
show_debug_message("ping: " + string(ping));
}
break;
}
Code:
tick++;
//send ping
if (tick mod 90 == 0)
{
readPing = current_time;
show_debug_message("send ping");
buffer_seek(cBufferID, 0, 0);
buffer_write(cBufferID, buffer_u8, CMD.PING);
var send = network_send_udp(cSocketID, remoteIP, remotePort, cBufferID, buffer_tell(cBufferID));
if (send < 0) show_debug_message("packet lost");
}
Last edited: