(5) 유닉스 소켓 sendmsg 메시지가 권한 오류를 반환합니다(EPERM)

Unix 소켓 sendmsg 메시지가 권한 오류를 반환합니다.

작성자:한 번 날짜:2023년 8월 16일

Linux 장치에서 Unix 소켓 sendmsg를 사용하여 오류 시나리오를 해결합니다 .

1. 질문

데이터그램 서비스인 유닉스 소켓을 위한 UDP와 유사한 전송이 있습니다. 이 소켓에는 피어 세트가 있을 수도 있고 없을 수도 있습니다. 다음과 같이:

  • socket(), 모든 소켓 작업의 기본이 되는 소켓을 생성합니다.
  • bind(), 유닉스 소켓의 경우 문자열 주소를 바인딩합니다.
  • connect(), Unix 데이터그램 소켓의 경우 피어를 바인딩할 수도 있습니다.

일반적으로 데이터그램 소켓의 경우 처음 두 단계만 필요합니다. 왜냐하면 데이터그램은 상태 비저장 연결이고 각 메시지가 독립적이며 추가 상태 유지 관리 프로세스가 없기 때문입니다 .

이때 sendmsg를 사용하여 메시지를 보내지만 반환 권한이 허용되지 않습니다. 오류(1)이고 수신된 메시지가 정확합니다. 즉, 피어가 이 소켓에 메시지를 보낼 수 있지만 우리는 이에 응답할 수 없습니다. 메시지가 나타나면 피어 소켓이 연결 작업을 수행했을 가능성이 매우 높습니다.

다음은 af_unix.c소스 코드의 함수에 있는 코드의 일부입니다 unix_dgram_sendmsg. 즉, sendmsg 함수 하단의 실제 호출 함수입니다 .

err = -EPERM;
if (!unix_may_send(sk, other))
    goto out_unlock;

여기에 판단이 있는데, 만족하지 않으면 바로 퇴장하세요 당연히 반환 허가 오류도 이 판단과 관련이 있습니다.

static inline int unix_our_peer(struct sock *sk, struct sock *osk)
{
	return unix_peer(osk) == sk;
}

static inline int unix_may_send(struct sock *sk, struct sock *osk)
{
	return unix_peer(osk) == NULL || unix_our_peer(sk, osk);
}

위와 같이 이 함수를 통해 전송된 대상 소켓에 피어가 있는지 여부와 대상 소켓의 피어가 로컬 소켓인지 여부를 확인하는 것을 알 수 있습니다. 대상 소켓에 피어 주소가 없거나( connect작업 없음) 개체가 로컬 끝인 경우에만 connect확인을 통과할 수 있습니다 . 그렇지 않으면 권한 오류가 반환됩니다.

2. 결론

위의 분석은 유닉스 데이터 그램 소켓이 다대다 무료 전송을 달성하려는 경우 연결 작업 EPERM을 포기해야 함을 보여줍니다. 그렇지 않으면 .

추천

출처blog.csdn.net/Once_day/article/details/132330977