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.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()

관련 정보