Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
UDP和TCP之间的同步_C_Linux_Tcp_Udp - Fatal编程技术网

UDP和TCP之间的同步

UDP和TCP之间的同步,c,linux,tcp,udp,C,Linux,Tcp,Udp,我目前正在实现一个充当两个服务器的守护进程服务器。其中一个服务器通过UDP从生产者集合接收日志。第二台服务器将从生产者接收到的每个日志广播给当前通过TCP连接的消费者 这是两个单独的插座。我当前最基本的实现是在这两个套接字上使用select,并相应地处理每个读取信号,所以我的代码是basiclyNOTE这是伪代码 for(;;) { FDSET(consumers_server) FDSET(producers_server) select() if consum

我目前正在实现一个充当两个服务器的守护进程服务器。其中一个服务器通过UDP从生产者集合接收日志。第二台服务器将从生产者接收到的每个日志广播给当前通过TCP连接的消费者

这是两个单独的插座。我当前最基本的实现是在这两个套接字上使用select,并相应地处理每个读取信号,所以我的代码是basiclyNOTE这是伪代码

for(;;) {
    FDSET(consumers_server)
    FDSET(producers_server)
    select()
    if consumers_server is set:
       add new client to the consumers array
    if producers server is set:
       broadcast the log to every consumer in the array
}
这很好,当这段代码被强调时,问题就出现了。当多个生产者发送logsUDP时,真正的瓶颈是消费者,他们是TCP。向消费者发送日志可能会导致阻塞,这是我无法承受的

我尝试过使用非阻塞套接字并选择使用者写入FD,问题是这会导致将未发送的日志保存在缓冲区中,直到可以发送为止。这将导致大量代码的编写非常不合理,而且系统的资源(主要是RAM)也很低

我正在linux发行版上运行


欢迎使用其他方法在这些UDP和TCP连接之间进行同步。

这注定会失败。迟早您将无法发送到TCP使用者。无论这表现为阻塞还是EAGAIN/ewoldblock,都与根本问题无关,即生产者正在超越消费者。你必须决定怎么做。您可以有一定量的内部缓冲,但在某个时候您必须停止从UDP生产者读取。在这一点上,UDP数据报将被丢弃,您的系统将丢失数据,当然,由于使用UDP,它很容易丢失数据


不要这样做。对生产者使用TCP:或者只接受数据丢失并使用阻塞模式。非阻塞模式只会稍微移动问题,并使代码复杂化。

您研究过多线程吗?有没有理由不使用相同的TCP连接?该设置看起来像是防火墙问题和维护问题。首先定义一个合适的协议,然后编写代码。@Olaf是的,原因是生产者不能阻止,发送消息时必须非常迅速。我需要区分消费者和生产者。我不能将同一个插座用于两个不同的目的。XY问题。你使用了错误的方法。它不会因为你使用了更多的套接字而变得更快。如果读者跟不上,你希望发生什么?