19.12.10 15:38 작성
·
237
1
accept 함수부분 설명에서 두번째와 세번째 파라미터에 NULL을 준다고 하셨는데, 왜 NULL을 주는 건지? bind함수처럼 지정하면 안되는지 궁금합니다.
답변 1
0
2019. 12. 11. 09:01
두번째/세번째 파라미터(child socket address/length) 지정하셔도 됩니다!! 제가 준비한 예제에서 사용하지 않았을 뿐입니다.
소켓은 종단(endpoint)간의 연결 입니다. 그래서 양 끝 socket에 자신의 address가 있죠. 이 address가 소켓 통신에서 나와 상대방의 identification이 되는 것이죠. server는 반드시 자신의 address를 bind 해야 합니다. 그래야 client가 server로 접속할 수 있겠죠. 반면 client는 자신의 address를 bind 해도 되고, 하지 않아도 됩니다. 프로그램에서 명시적으로 설정하지 않았다면 커널이 자동(임의 설정)으로 해주기 때문이죠. 제가 준비한 예제에서는 client socket에 address를 명시적으로 설정하지 않습니다. 커널에게 맡긴 것이죠.
그렇기 때문에 server에서 accept() 할 때 client의 address를 받아오는 두번째/세번째 파라미터를 NULL로 입력한 것입니다. 받아와봐야 의미 없는 값(커널이 임의 설정한 값)이 나오기 때문입니다.
예제를 수정하여 client socket에 address를 bind하고, server에서는 accept 시 child address를 받아오게 한다면 정상 동작할 것입니다. unix domain socket에서 child socket에 address를 지정해 연결하는 예제는 아래 링크를 참조해주세요
https://www.ibm.com/support/knowledgecenter/en/SSB23S_1.1.0.14/gtpc1/unixsock.html
좋은 질문 감사합니다~ :D