多线程udp服务器

时间:2014-03-18 16:21:45

标签: c multithreading udp

我是线程的新手,如果你能给我建议请。我有服务器广播消息 对客户。然后客户端将回复发送回服务器。我想处理每个回复 单独的线程。每个回复都有mesage id和thread id。我怎样才能填写一些结构 从所有线程获取此信息,然后阅读

同样来自我的代码,是否正确创建线程,或者它是否存在 如果我收到客户的回复,创建线程?

我是从正确的理解开始的吗?

int main(){

    while(1){

        sendto on broadcast IP 
        pthread_create(&cln_thread, NULL, msg_processing, (void *) &arg))

   }
}

msg_processing () {

     recvfrom client msg with id of packet and thread id
     how to write those informations and then read them in main when program finish

}

谢谢

1 个答案:

答案 0 :(得分:4)

错误..不,只需创建一个线程,一次,用于在一个套接字上接收数据报。在线程函数中,在while(true)循环中接收数据报。不要让这个接收线程终止,不要再创建接收线程。不断创建/终止/销毁线程是低效,危险,不必要的,容易出错,难以调试的,你应该非常努力地不去做。

编辑:

只接收一个线程 - 但您不必在那里进行处理。 Malloc是64K缓冲区,接收数据到其中,将缓冲区指针推送到生产者 - 消费者队列到一个将执行处理的线程池,循环返回,然后再次使用malloc来重新安装指针并为下一个数据报创建另一个缓冲区。处理完成后,释放池线程中的*缓冲区。当缓冲区处理同时运行时,接收线程将快速返回等待数据报。

如果您发现数据报可以快速到达以至于处理无法跟上,则随着越来越多的*缓冲区堆积在队列中,内存使用将不受限制地增加。这有几种方法。您可以使用有界队列阻止其容量达到。你可以在启动时创建x缓冲区并将它们存储在接收线程弹出的另一个生产者 - 消费者'池队列'上(而不是malloc) - 处理池线程然后可以将'used'* buffers重新推送到池队列重用。如果池用完,接收线程将阻塞池,直到返回* buffers。

我更喜欢池化缓冲方法,因为它在整个系统中限制了内存使用,避免了连续的malloc / free及其碎片问题等,避免了更复杂的有界队列,更容易调整,(池级别很容易在运行时更改,并且更容易监视/调试 - 我通常使用计时器将池级别(即队列计数)转储到显示器一次。

在任何一种情况下,数据报都可能会丢失,但如果您的系统过载导致数据定期到达的速度比可能处理的速度快,那么无论如何设计都会如此。

一个插座很好,为什么复杂很重要? :)