这严格在 Unix 数据报套接字的上下文中: family = AF_UNIX/AF_LOCAL type = SOCK_DGRAM
对于客户端向服务器发送消息的情况,以下内容看起来正确吗?目前不需要服务器发送到客户端。
监听/服务器套接字:
1.1.使用创建套接字
socket()
1.2.
bind()
到文件路径1.3.
recv()
或recvfrom()
或recvmsg()
或read()
除非通过 指定,否则默认情况下将被阻止fcntl()
。客户端套接字:
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()
。