Closed nominalval closed 11 months ago
UDP only uses one fd, unlike TCP which uses a new fd every time it accepts a new connection. An fd is usually processed using one loop. If you want to process it with multiple threads, you should distribute the message received from recvfrom to multiple threads to consume.
I am concerned about I/O block when receiving UDP packets, this is why I want to write a program similar to an app written in node.js
that uses dgram
and cluster
packages.
const os = require('os');
const dgram = require('dgram');
const cluster = require('cluster');
const client_udp = dgram.createSocket('udp4');
config = {};
config['host'] = "127.0.0.1";
config['port'] = 7500;
if(cluster.isMaster)
{
// Master process
for (let i = 0; i < os.cpus().length; i++)
{
worker = cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
worker = cluster.fork();
});
}
else
{
// Child
const server = dgram.createSocket('udp4');
server.on('message', (msg, rinfo) => {
console.log("Message got from #"+process.pid+" :"+msg);
});
server.on('listening', () => {
const address = server.address();
if(config['debug'] >= 1) console.log(`UDP server listening on ${address.address}:${address.port}`);
});
server.bind(config.port,config.host);
}
NETCAT:
nc 127.0.0.1 7500 -u
ss
dd
ff
ss
ff
ss
OUTPUT:
Message got from #12786 :ss
Message got from #12787 :dd
Message got from #12787 :ff
Message got from #12799 :ss
Message got from #12787 :ff
Message got from #12787 :ss
I want to obtain same behavior (even though i see that the load balancing is not fair). For I/O operation i pass them in a thread pool already, i am just concerned about the fact that for high amount of data flow it can loose data, that is why i want to have events + threads.
Thank you.
Multi-processes mode, please refer to https://github.com/ithewei/libhv/blob/master/examples/multi-thread/multi-acceptor-processes.c.
Thank you for your answer, your library is great. This is what i want but using UDP not TCP.
Thank you for your answer, your library is great. This is what i want but using UDP not TCP.
TCP => UDP
Listen(port, host) => Bind(port, host, SOCK_DRGRAM)
haccept (hio_get -> hio_setcb_accept -> hio_accept) => hio_get(fd) -> hio_setcb_read -> hio_read
Is this the order of the function that i should call?
I would like to see an example, as i have already tried before.
I also don't see a simple sender in C, would be great if there were one.
Thank you for taking your time and solve this. I will test this in a emulated production environment with a lot of requests.
Hello. I am trying to build a simple UDP multi-threaded echo server in
C
usinglibhv
(library is using non-blocking events).Basically i am trying to combine https://github.com/ithewei/libhv/blob/master/examples/udp_echo_server.c with the threading of https://github.com/ithewei/libhv/blob/master/examples/multi-thread/one-acceptor-multi-workers.c
I do this because i will have high amount of traffic and multiple threads will be needed to handle that kind of stream.
SOURCE CODE:
If i do a simple test, it is oppening 4 threads but also observe that it only uses one thread:
netcat test1:
netcat test2:
Output:
As you can see
tid=27641
remains the same even after re-connection.What should i solve this?
Thank you.