Unix 数据报套接字的典型生命周期是怎样的?

Unix 数据报套接字的典型生命周期是怎样的?

这严格在 Unix 数据报套接字的上下文中: family = AF_UNIX/AF_LOCAL type = SOCK_DGRAM

对于客户端向服务器发送消息的情况,以下内容看起来正确吗?目前不需要服务器发送到客户端。

  1. 监听/服务器套接字:

    1.1.使用创建套接字socket()

    1.2.bind()到文件路径

    1.3.recv()recvfrom()recvmsg()read()除非通过 指定,否则默认情况下将被阻止fcntl()

  2. 客户端套接字:

    2.1.使用创建套接字socket()

    2.2.bind()到1.2中的文件路径。这会引发 EADDRINUSE 该地址已在使用中。如果connect()用 then 代替这会导致 EPERM 操作不被允许。

    2.3.sendto()sendmsg()write()

答案1

您的侦听/服务器套接字逻辑看起来正确,但对于客户端套接字:

1.2.bind() 到文件路径。这会引发 EADDRINUSE 该地址已在使用中。

...当然,因为侦听套接字已经声明了该地址。

客户端套接字通常需要connect()访问侦听套接字正在侦听的路径。

如果使用 connect() ,则会导致不允许 EPERM 操作。

我不确定你为什么会收到这个错误。我正在考虑权限问题,但权限问题似乎导致 EACCES,而不是 EPERM。尝试不使用connect()?如果省略connect()数据报套接字,这意味着您必须使用它sendto()来指定每个数据包的目标地址。您不能使用send()write()期望已使用 预先选择目标地址connect()

相关内容