【问题标题】:When should a datagram socket be connected?什么时候应该连接数据报套接字?
【发布时间】:2013-12-11 22:29:39
【问题描述】:

我正在使用 C 语言,使用 POSIX 套接字 API。

我不确定何时适合连接数据报套接字。据我了解,UDP 是无连接的,SOCK_DGRAM 套接字使用 UDP。那么在数据报套接字上使用 connect() 和 accept() 会发生什么?

在我看来,连接它们并使用 send()/recv() 比不连接它们并使用 sendto()/recvfrom() 更容易。

连接时套接字的功能是否有所不同,或者这只是一种抽象?

【问题讨论】:

    标签: c sockets posix


    【解决方案1】:

    当您希望send() 使用默认目标对等方的便利性时,数据报套接字上的connect() 是合适的,而不是使用sendto() 显式指定目标。没有功能上的区别。

    connect()ing 到 AF_UNSPEC 地址将清除数据报套接字的默认对等点。 (我认为,最后一种行为得到了广泛支持,但仅限于 recently formalized。)

    数据报套接字上的connect() 会将recv()s 限制为来自对等方的数据。

    无论“连接性”如何,数据报套接字上的accept() 都是错误 (EOPNOTSUPP)。

    【讨论】:

    • 它确实改变了recv的含义。来自man connect:“如果套接字 sockfd 是 SOCK_DGRAM 类型,那么 addr 是默认发送数据报的地址,也是接收数据报的唯一地址。”
    • @Guido,确实是的。编辑。
    • 那么答案很好。我要补充一点,如果您只打算与另一台主机(确切地说是套接字)通信,那么您“应该”连接一个 DGRAM 套接字。例如,在流式传输视频时,这可能是可取的,但在 P2P 网络软件中是不可取的。
    猜你喜欢
    • 1970-01-01
    • 2018-05-08
    • 2013-04-25
    • 1970-01-01
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    相关资源
    最近更新 更多