2014-02-12 8 views
0

나는 사용자 공간 어플리케이션 인 socket()을 호출하고 에러를 얻습니다. 에러는 errno = 1 = EPERM입니다. 나는 루트가 아니다 .. sudo로 내 애플리케이션을 호출하는 것 외에 뭔가해야 할 일이 있습니까?socket()이 실패합니다 - errno EPERM - 우분투

if ((sock=socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)))<0) { //error in socket() } 
+0

몇 가지 코드를 공유 할 수 있습니까? – fritzone

+0

어떤 종류의 소켓을 열려고합니까? 귀하의 질문과 관련된 코드를 게시 할 수 있습니까? –

+0

UNIX 유형 소켓 인 경우 파일에 대한 읽기/쓰기 권한이 없을 수 있습니다. –

답변

3

하고자하는 프로세스가 사용하기 때문이다 SOCK_RAW 소켓이 필요 중 하나 CAP_NET_RAW 능력을 갖는 또는 UID제로 (루트)의 매뉴얼 페이지에서 갖는

코드입니다 :

유효 사용자 ID가 0 인 프로세스 또는 CAP_NET_RAW 기능 만 원시 소켓을 열 수 있습니다.

+0

great. $ sudo setcap cap_net_raw = ep ./my_app $./my_app 하지만이 소켓을 바인딩 할 때 오류가 발생합니다. socket (AF_UNIX, SOCK_DGRAM, 0) – user1047069

+0

위대한 있습니다. $ sudo setcap cap_net_raw = ep ./my_app $./my_app 하지만이 소켓을 바인딩 할 때 오류가 발생합니다. socket (AF_UNIX, SOCK_DGRAM, 0) DGRAM이 바인딩에 필요한 기능은 무엇입니까? – user1047069

+0

errno에 어떤 오류가 있습니까? bind (단순히 소켓을 만들거나 실제로'syscall'bind'를 사용하여)라는 것은 무엇을 의미합니까? 또한, SOCK_RAW에서 SOCK_DGRAM (소켓 인터페이스를 통해 데이터 그램을 보내기 위해 사용)에 대해서 왜 설명 했습니까? –

관련 문제