diff options
| author | Magnus Auvinen <magnus.auvinen@gmail.com> | 2007-07-13 13:40:04 +0000 |
|---|---|---|
| committer | Magnus Auvinen <magnus.auvinen@gmail.com> | 2007-07-13 13:40:04 +0000 |
| commit | 125d04e51f4e444a38cf038d3ea095d92d3c6dbb (patch) | |
| tree | 2288bbe4b923ab4d695e9f852c177a12f74ea799 /src/crapnet/crapnet.cpp | |
| parent | 7be0ae1b2929a3c5dfedf542bce886deefa0f862 (diff) | |
| download | zcatch-125d04e51f4e444a38cf038d3ea095d92d3c6dbb.tar.gz zcatch-125d04e51f4e444a38cf038d3ea095d92d3c6dbb.zip | |
large rewrite and code cleanup
Diffstat (limited to 'src/crapnet/crapnet.cpp')
| -rw-r--r-- | src/crapnet/crapnet.cpp | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/src/crapnet/crapnet.cpp b/src/crapnet/crapnet.cpp new file mode 100644 index 00000000..b441a350 --- /dev/null +++ b/src/crapnet/crapnet.cpp @@ -0,0 +1,126 @@ +#include <baselib/system.h> +#include <baselib/network.h> + +#include <cstdlib> + +using namespace baselib; + +struct packet +{ + packet *prev; + packet *next; + + netaddr4 send_to; + int64 timestamp; + int id; + int data_size; + char data[1]; +}; + +static packet *first = (packet *)0; +static packet *last = (packet *)0; +static int current_latency = 0; +static int debug = 0; + +int run(int port, netaddr4 dest) +{ + netaddr4 src(0,0,0,0,0); + socket_udp4 socket; + socket.open(port); + char buffer[1024*2]; + int id = 0; + + while(1) + { + // handle incomming packets + while(1) + { + // fetch data + netaddr4 from; + int bytes = socket.recv(&from, buffer, 1024*2); + if(bytes <= 0) + break; + + // create new packet + packet *p = (packet *)mem_alloc(sizeof(packet)+bytes, 1); + + if(from == dest) + p->send_to = src; + else + { + src = from; + p->send_to = dest; + } + + // queue packet + p->prev = last; + p->next = 0; + if(last) + last->next = p; + else + { + first = p; + last = p; + } + last = p; + + // set data in packet + p->timestamp = time_get(); + p->data_size = bytes; + p->id = id++; + mem_copy(p->data, buffer, bytes); + + if(debug) + dbg_msg("crapnet", "<< %08d %d.%d.%d.%d:%5d (%d)", p->id, from.ip[0], from.ip[1], from.ip[2], from.ip[3], from.port, p->data_size); + } + + // + while(1) + { + //dbg_msg("crapnet", "%p", first); + if(first && (time_get()-first->timestamp) > current_latency) + { + packet *p = first; + first = first->next; + if(first) + first->prev = 0; + else + last = 0; + + if(debug) + { + dbg_msg("crapnet", ">> %08d %d.%d.%d.%d:%5d (%d)", p->id, + p->send_to.ip[0], p->send_to.ip[1], + p->send_to.ip[2], p->send_to.ip[3], + p->send_to.port, p->data_size); + } + + // send and remove packet + if((rand()%10) != 0) // heavy packetloss + socket.send(&p->send_to, p->data, p->data_size); + + // update lag + double flux = rand()/(double)RAND_MAX; + int ms_spike = 250; + int ms_flux = 100; + int ms_ping = 50; + current_latency = ((time_freq()*ms_ping)/1000) + (int64)(((time_freq()*ms_flux)/1000)*flux); // 50ms + + if((p->id%100) == 0) + current_latency += (time_freq()*ms_spike)/1000; + + mem_free(p); + } + else + break; + } + + thread_sleep(1); + } +} + +int main(int argc, char **argv) +{ + run(8302, netaddr4(127,0,0,1,8303)); + return 0; +} |