これは厳密に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.1.2
bind()
のファイルパスへ。EADDRINUSE アドレスはすでに使用中です。connect()
代わりに使うならこれにより EPERM 操作は許可されません。2.3。または
sendto()
sendmsg()
write()
答え1
リスニング/サーバーソケットロジックは正しいように見えますが、クライアントソケットの場合:
1.2.bind() をファイルパスに接続します。 EADDRINUSE アドレスはすでに使用中です。
...もちろん、リスニングソケットがすでにそのアドレスを要求しているからです。
クライアントソケットは通常、connect()
リスニングソケットがリスニングしているパスにアクセスする必要があります。
connect()を使用すると、EPERM操作は許可されません。
なぜこのエラーが発生するのかわかりません。権限の問題を考えていましたが、権限の問題により EPERM ではなく EACCES が発生しているようです。 Try Without connect()
?データグラムソケットを省略すると、各パケットの宛先アドレスを指定するためにconnect()
それを使用する必要があります。事前に選択した宛先アドレスを使用または使用したことは期待sendto()
できません。send()
write()
connect()