如何从服务器端区分客户端使用的是TCP还是UDP

9
我正在编写一个简单的客户端-服务器程序。
客户端使用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吗? - seg.server.fault
2
@seg.server.fault:我建议您在客户端代码中 不要 调用 bind()。虽然这在技术上是可能的(并且在非常特定的情况下是必需的),但没有客户端 bind() 的默认行为通常是应用程序层所需的。此外,请记住,您可以在 UDP 套接字上调用 connect()。它不会进行任何握手,但这意味着您可以使用 send/recv 而不是 sendto/recvfrom,这可能会使客户端逻辑更简单。 - Tom
4个回答

18

当数据包到达你的时候,你不知道它是 UDP 还是 TCP

因此,如果你期望双向请求,你需要绑定到 UDPTCP 套接字。

一旦绑定了这两种套接字,你就可以通过接收数据包的套接字来确定它是哪种方式传输的。


6
当您创建套接字时,需要传递一种类型 - SOCK_STREAM(TCP)或SOCK_DGRAM(UDP)。
因此,这两种类型的流量将分别传输到两个不同的套接字上。

那对服务器端没有帮助。原始发布者已经知道客户端将决定TCP还是UDP。问题在于在服务器端支持它们,这需要比简单更改套接字类型大得多的工作量。 - Tom

2

正如Henry Troup所指出的,IP套接字被定义为

(传输方式、接口、端口)。

(UDP, 127.0.0.1, 80)和(TCP, 127.0.0.1, 80)不是同一个IP套接字,因此您可以安全地绑定它们并侦听传入的流量。


1

只需让TCP套接字监听X端口,并通过Y端口进行UDP连接


9
您可以在同一个端口上安全地同时使用UDP和TCP进行监听。 - Michael Krelin - hacker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接