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
을 포기해야 함을 보여줍니다. 그렇지 않으면 .