1

如果我有一个 UDP 服务器来处理传入的请求,处理传入recvfrom的请求(可能很耗时),可能会发回响应,然后recvfrom再次调用,最好创建一个带有信息的新 sock_fdsockaddr* from来发送使用服务器的 sock_fd 回复还是使用服务器的 sock_fd 发送回复?

基本上,问题是我是否需要创建新的 sock_fd 的开销,或者我是否希望我的服务器能够处理请求而不必等待发送先前的请求响应。

我无法根据应用程序的需求来决定,因为这将在库中使用(因此我不知道是否需要响应,以及处理请求需要多长时间)。

我看不出这不是一个真正的问题。上面的粗体部分和第一句的最后部分清楚地提出了这个问题

4

2 回答 2

4

没有必要创建一个新sock_fd的,因为创建的那个已经bind作为它的服务器进行了调用。

此外,您必须确保客户端不会在阻塞中等待响应recvfrom

如果大多数服务器无法给出正确的响应,并且客户端会根据该错误代码执行重复请求或其他操作,则大多数服务器会发送一些错误代码,您可能需要以请求-响应的方式设计协议。

如果处理是一个问题,那么您始终可以将struct sockaddr 客户端的数据+放在队列中并通过向线程发出唤醒信号来延迟处理,这样做您的侦听线程可以recvfrom快速恢复,然后您可以发送来自处理的响应完成后线程保存struct sockaddr 到客户端

于 2013-02-21T06:50:06.043 回答
0

我想要创建一个新的 sock_fd 的开销吗

不。

或者我是否希望我的服务器能够处理请求而不必等待发送前一个请求响应。

没有人必须等待通过 UDP 套接字发送消息。如果您愿意,您可以在单独的线程上处理每个传入的请求,并且sendmsg()如果需要,它们都可以同时调用。

您肯定只想使用一个套接字。一方面,这意味着回复将返回给客户端,并带有与他们发送的相同的源地址信息,这将全面减少混乱。

于 2013-02-21T07:05:20.750 回答