【问题标题】:how to differentiate if client is using TCP or UDP from server side如何区分客户端是从服务器端使用 TCP 还是 UDP
【发布时间】:2010-11-29 12:31:02
【问题描述】:

我正在编写简单的客户端-服务器程序。

客户端使用 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()。

那么,我如何在一开始就区分/知道这一点,以便进行适当的函数调用。

谢谢。

【问题讨论】:

  • 那么,我应该在服务器端创建两个套接字,一个用于 UDP,另一个用于 TCP 吗?
  • @seg.server.fault:我建议在您的客户端代码中调用bind()。虽然它在技术上是可行的(并且在非常特定的情况下需要),但没有客户端 bind() 的默认行为通常是您在应用程序层想要的。另外,请记住,您可以在 UDP 套接字上调用 connect()。它不做任何握手,但这确实意味着您可以使用send/recv 而不是sendto/recvfrom,这最终可能会使客户端逻辑更简单。

标签: c++ c networking sockets network-programming


【解决方案1】:

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

【讨论】:

  • 您可以在同一个端口上安全地监听 UDP 和 TCP。
【解决方案2】:

在数据包到达您之前,您不知道它是UDP 还是TCP

因此,如果您希望双向请求,则希望同时绑定到 UDPTCP 套接字。

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

【讨论】:

    【解决方案3】:

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

    所以这两种流量将在两个不同的套接字上。

    【讨论】:

    • 这对服务器端没有帮助。 OP 已经知道客户端将决定 TCP 还是 UDP。问题是在服务器端同时支持它们,这比简单地更改套接字类型要付出更多的努力。
    【解决方案4】:

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

    (传输、接口、端口)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-04
      • 2010-09-29
      • 1970-01-01
      • 2012-12-18
      • 1970-01-01
      • 2015-11-04
      • 2018-06-06
      相关资源
      最近更新 更多