2010-11-16 82 views
0

我想用c语言编写udp聊天服务器。我以前写过tcp聊天服务器,没关系。udp聊天服务器在c

在tcp服务器中,accept函数返回一个fd号,服务器根据这个fd号与特定的客户端进行通信。

但在udp中,我怎么能听特定的客户端?

在我的tcp服务器中,在客户端连接到服务器之后,创建了一个线程并且它监听该客户端。因此,对于每个客户端,都有一个线程根据从接受函数返回的fd号进行侦听。所以任何消息都可以根据这个fd号码发送给特定的客户端。

我该如何在udp服务器上实现这个功能?

感谢您的回答。

回答

1

您使用recvfrom找出源IP /端口,然后用sendto回复。您只需要bind即可选择一个服务器端口。你不要accept。所有connect确实为UDP设置了默认目标(您打算用sendto覆盖)。

+0

我使用了recvfrom和sendto函数。首先客户端通过sendto向服务器发送消息。服务器通过recvfrom接收消息。在recvfrom我通过sockaddr_in结构获取客户端的地址。我无法找到后绑定这个并使用sendto – cemal 2010-11-16 21:31:12

+0

你不*绑定*,那就是目的地。你可以单独离开你的套接字,只需调用sendto。 – 2010-11-16 21:32:38

0

只需创建一个UDP套接字并调用connect()。但你不想这样做。 UDP服务器的全部喜悦是它们只需要一个套接字。想一想。你只需要TCP中的线程,因为你不得不拥有一个专用的套接字,而专用的线程是处理它的最简单(也是唯一)的方式。在UDP中,你可以继续读取同一个套接字,并且源地址告诉你每个图表来自哪个客户端。

+1

这里是我的代码示例: – cemal 2010-11-16 21:29:56

0

我使用了recvfrom和sendto函数。首先客户端通过sendto向服务器发送消息。服务器通过recvfrom接收消息。在recvfrom我通过sockaddr_in结构获取客户端的地址。我无法达到这个结果后,使用sendto

1

这很简单。 正如你所知道的UDP是无连接的,它可能共享相同的端口。所以这个想法就在这里。只需为每个客户端创建线程。如果你拥有更多的CPU核心,那将是非常棒的。你可以为特定数量的客户端使用每个核心(可以通过map)现在,当同一个客户端再次敲入时,只需将它发送到该线程和核心即可。因此,如果您拥有1 ... n核心,则必须创建n个线程并将cpu设置为每个线程。

我已经用这种方式做了8核心服务器的实验,它的工作正常。

我会给我一些日子博客的代码后,它cheacking到千兆交换机后.. :)

matrixsust.blogspot.com

希望它可以帮助。