2009-09-18 49 views
8

我正在写简单的客户端服务器程序。如何区分客户端是否使用TCP或UDP从服务器端

客户端使用UDP或TCP向服务器发送一些消息。服务器必须能够支持UDP和TCP。

如果客户端使用UDP发送消息,客户端的方法调用顺序为socket(),bind(),sendto(),recvfrom(),close(),服务器中的方法调用顺序为socket(),bind(),sendto(),recvfrom(),close()

如果它使用TCP, 服务器中的呼叫顺序是 socket(),bind(),listen(),accept(),send(),recv(),close()。 和在客户端是 socket(),bind(),connect(),send(),recv(),close()

在我的程序中,用户/客户端在开始时给出了选择他想要使用UDP或TCP的选择。所以,我的主要问题是如何在服务器端知道或区分,如果客户端使用TCP或UDP发送消息。如果它使用TCP,我必须调用listen(),accept(),send(),recv() ,如果它使用UDP,我不会调用listen(),accept(),而是调用sendto()和recvfrom )。

那么,我怎么才能区分/了解这一开始,以便我可以做出适当的函数调用。

谢谢。

+1

那么,我应该在服务器端创建两个套接字,一个用于UDP,另一个用于TCP? – 2009-09-18 14:52:41

+0

seg.server.fault,是的。 – 2009-09-18 15:15:58

+2

@ seg.server.fault:我会推荐_not_在您的客户端代码中调用'bind()'。虽然它在技术上是可行的(并且在非常特定的情况下是必需的),但没有客户端'bind()'的默认行为通常是您在应用程序层需要的。 另外,请记住,你可以在UDP套接字上调用'connect()'。它没有进行任何握手,但是这意味着你可以使用'send/recv'而不是'sendto/recvfrom',这可能最终导致客户端逻辑变得更简单。 – Tom 2009-10-24 05:47:59

回答

15

做UDP连接的数据包到达你之前,你不知道它是否是UDPTCP做。

因此,如果您希望同时请求这两种方式,您希望绑定到UDPTCP套接字。

一旦你做了,你就知道它通过你接收数据包的套接字来的方式。

1

只是让口X TCP套接字监听,并通过出口Y

+6

您可以安全地在同一个端口上监听UDP和TCP。 – 2009-09-18 14:48:08

5

当您创建套接字,你传递一个类型 - SOCK_STREAM(TCP)或SOCK_DGRAM(UDP)

所以两种流量将在两个不同的插座。

+0

这对服务器端没有帮助。 OP已经知道客户端将决定TCP与UDP。问题是在服务器端支持它们,这比单纯更改套接字类型要花费更多的精力。 – Tom 2009-10-24 05:45:08