C 多线程udp服务器

C 多线程udp服务器,c,multithreading,udp,C,Multithreading,Udp,我是个新手,如果你能给我建议的话,请告诉我。我有一个广播信息的服务器 给客户。然后客户端将回复发送回服务器。我想使用 分离线。每个回复都有mesage id和thread id。如何填写一些结构 使用来自所有线程的此信息,然后读取它 同样从我的代码来看,在while中创建线程是正确的,还是以某种方式存在 若我从客户端得到回复,是否创建线程 我是从正确的理解开始的吗 int main(){ while(1){ sendto on broadcast IP

我是个新手,如果你能给我建议的话,请告诉我。我有一个广播信息的服务器 给客户。然后客户端将回复发送回服务器。我想使用 分离线。每个回复都有mesage id和thread id。如何填写一些结构 使用来自所有线程的此信息,然后读取它

同样从我的代码来看,在while中创建线程是正确的,还是以某种方式存在 若我从客户端得到回复,是否创建线程

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

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

}

谢谢你

呃。。不,只需创建一个线程,仅一次,用于在一个套接字上接收数据报。在线程函数中,在while(true)循环中接收数据报。不要让此接收线程终止,也不要再创建任何接收线程。不断地创建/终止/销毁线程是低效的、危险的、不必要的、容易出错的、难以调试的,您应该尽最大努力避免这样做

编辑:

只有一个接收线程-但您不必在那里进行处理。Malloc一个64K的缓冲区,接收数据,将缓冲区指针推到生产者-消费者队列上,推到一个线程池中,该线程池将进行处理,循环返回,然后Malloc再次重置指针,并为下一个数据报创建另一个缓冲区。处理完成后,释放池线程中的*缓冲区。当缓冲区处理并行运行时,接收线程将返回等待数据报

如果您发现数据报到达的速度太快,以至于处理无法跟上,那么随着队列中越来越多的*缓冲区堆积起来,内存使用将不受限制地增长。有两种方法可以解决这个问题。您可以使用一个有界队列,该队列在达到其容量时阻塞。您可以在启动时创建x个缓冲区,并将它们存储在接收线程从中弹出的另一个生产者-消费者“池队列”(而不是malloc)上——然后处理池线程可以将“已使用的”*缓冲区推回到池队列上以供重用。如果池用完,接收线程将阻塞池,直到返回*缓冲区

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

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


一个插座就可以了,为什么要把事情复杂化呢

呃。。不,只需创建一个线程,仅一次,用于在一个套接字上接收数据报。在线程函数中,在while(true)循环中接收数据报。不要让此接收线程终止,也不要再创建任何接收线程。不断地创建/终止/销毁线程是低效的、危险的、不必要的、容易出错的、难以调试的,您应该尽最大努力避免这样做

编辑:

只有一个接收线程-但您不必在那里进行处理。Malloc一个64K的缓冲区,接收数据,将缓冲区指针推到生产者-消费者队列上,推到一个线程池中,该线程池将进行处理,循环返回,然后Malloc再次重置指针,并为下一个数据报创建另一个缓冲区。处理完成后,释放池线程中的*缓冲区。当缓冲区处理并行运行时,接收线程将返回等待数据报

如果您发现数据报到达的速度太快,以至于处理无法跟上,那么随着队列中越来越多的*缓冲区堆积起来,内存使用将不受限制地增长。有两种方法可以解决这个问题。您可以使用一个有界队列,该队列在达到其容量时阻塞。您可以在启动时创建x个缓冲区,并将它们存储在接收线程从中弹出的另一个生产者-消费者“池队列”(而不是malloc)上——然后处理池线程可以将“已使用的”*缓冲区推回到池队列上以供重用。如果池用完,接收线程将阻塞池,直到返回*缓冲区

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

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


一个插座就可以了,为什么要把事情复杂化呢

好的,我明白了。但这个应用程序将是实时的,所以我想知道一个线程是否足以处理来自客户端的所有回复?一个套接字是否足以发送和接收,或者我是否可以创建两个不同的套接字?感谢Stear Martin,我不太擅长编程,尤其是我对这个东西比较陌生…所以我不理解你一半的解释:)首先,在上面的代码中,我在while循环中创建了更多线程,我收到缓冲区中的数据,在读了我感兴趣的内容后,我将其设置为0…另一件事,如果我在while之前创建了一个线程,然后在调用函数msg_proccesing时,我无法从客户端接收任何信息,所以我不知道如何使用一条线程,然后先尝试一些更简单的方法!你能帮我实现一个线程吗?正如我所说,当我只创建一个线程,然后调用函数服务器不接收回复…好的,我明白了。但是这