【问题标题】:POSIX sockets: Accepting connections with different transport protocols?POSIX 套接字:接受不同传输协议的连接?
【发布时间】:2013-12-18 14:56:29
【问题描述】:

我想知道就接受 N 个不同连接所需的侦听端口/服务器套接字的数量而言,所需的最低开销是多少,每个连接都使用在 IP 之上运行的不同传输协议,例如TCP、SCTP、DCCP、UDP等

当然,一个简单的方法是拥有 N 个独立的服务器套接字(每个通过调用 socket() 并使用适当的 protocol 参数创建),每个都侦听一个唯一的端口。但是,在同时使用多个协议的应用程序中实现这种方法会非常不方便,因为客户端需要知道多个服务器端口。此外,在一个对等应用程序中,每个协议只对等一次(使用相同的客户端),N 个服务器套接字中的每一个只接受一个(客户端)连接的事实看起来像是一个巨大的开销(N 个额外的引入套接字纯粹是为了处理到单个对等客户端的 N 个“真实”连接)。

是否有可能做得比这更好,例如通过减少侦听服务器套接字的数量和/或在同一端口上侦听?

(为简单起见,您可以假设 N=2,一个连接是 TCP,另一个是 DCCP 或 UDP(请不要假设无连接通信,因为 DCCP 是面向连接的)。)

编辑:我对 N 个(客户端)连接不感兴趣,这些连接的文件描述符由 N 次调用 accept 返回。问题在于使这 N 个连接成为可能的额外开销(即必须至少有一个额外的服务器套接字来侦听传入连接)。

【问题讨论】:

  • 无法想象这样的设计能达到什么目的......
  • '客户端需要知道多个服务器端口' - 为什么?它只需要知道它希望使用的服务。
  • 如果您想在 LAN 应用程序中广播大量数据,例如,使用 UDP 等协议是有意义的,只要您不关心数据包丢失和重新排序。
  • @leden 然后我看不出你真正在问什么。如果您希望客户端在 N 个不同的任意传输上进行连接,则客户端会创建它想要连接的任意数量的套接字。服务器侦听具有明确定义的端口号的 N 个套接字。 (或者,正如您所说,您可以只有一个定义明确的协议/端口,例如 TCP,然后按需创建其他协议/端口,然后将端口号发回)
  • @leden 好的。答案是不。 socket API 没有这个概念。

标签: sockets unix posix protocols transport


【解决方案1】:

总结上面的 cmets 所说的话:因为在

int socket(int domain, int type, int protocol)

调用我们必须指定protocol,我们不能将一个套接字用于多个协议。我们也不能便携写

socket(AF_INET, SOCK_RAW, 0);

SOCK_RAW Demystified

关于使用不同套接字的相同端口:这种可能性因系统而异; e. G。请参阅 HP-UX (man 7f inet):

  The local port address is selected from independent domains for TCP
  and UDP sockets.  This means that creating a TCP socket and binding it
  to local port number 10000, for example, does not interfere with
  creating a UDP socket and also binding it to local port number 10000
  at the same time.

对比Linux (man ip):

  Only one IP socket may be bound to any given local (address, port) pair.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    相关资源
    最近更新 更多