소켓 프로그래밍에 대한 매우 좋은 글이 있어서 소개합니다. 저도 소켓 프로그래밍을 하다 보면 책으로는 해소할 수 없는 궁금한 내용이 많습니다. 이렇게 간질간질한 곳을 시원하게 긁어 주는 "C에 의한 유닉스 소켓 프로그래밍 - FAQ" 라는 문서가 있어서 앞으로 몇 회로 나누어 올리려 합니다.

문서 정보
  • Archive-name: unix-faq/socket
  • Posting-Frequency: monthly
  • 최근 수정일: 1997/12/21
  • URL: http://www.auroraonline.com/sock-faq/
  • 한글판작성자: 안창선(csan@coresw.co.kr, http://genesis.yonsei.ac.kr/~kabin)

작성을 Vic Metcalfe, Andrew Gierth 와 이외 몇 분이 작성하고, 감사하게도 안창선(csan@coresw.co.kr) 이라는 분이 읽기 편하게 한글로 변역해 주셨습니다.

문서 정보에는 http://www.auroraonline.com/sock-faq/ 로 소개되어 있었습니다만 문서가 오래되서 인지 열리지 았습니다. 대신에 웹으로 검색해 보니 아래의 링크에서 FAQ 자료를 볼 수 있었습니다.

Unix Socket FAQ

위 링크보다 더 최근의 문서와 더 활발한 활동을 하는 웹 페이지는 아직 모릅니다만 찾게되면 본 문서를 업데이트하겠습니다.

전체 목차를 보시면 과연 어떤 내용이 들어 있는지 한 눈에 아실수 있겠죠. 전체 목차입니다. 앞으로 문서를 모두 올리면 아래의 목차 모두에 링크를 걸어서 보다 편리하게 문서를 보실 수 있도록 하겠습니다.

목차

  1. 일반 정보와 개념
    1. 이 FAQ에 대하여
    2. 누구를 위한 FAQ 인가?
    3. 소켓은 무엇인가?
    4. 소켓은 어떻게 작동하는가?
    5. 책에 있는 소스코드를 구할 수 있는데가 있는가?
    6. 또 다른 정보들은 어디에서 구할 수 있는가?
  2. 클라이언트와 서버 양쪽에 관한 질문 (TCP/SOCK_STREAM)
    1. 언제 상대방쪽 소켓이 끊겼는지 알 수 있는 방법이 있는가?
    2. bind()의 두 번째 파라메터는 무엇인가?
    3. 주어진 서비스의 port번호를 얻는 방법은?
    4. bind() 가 실패 했을 때 소켓 디스크립터를 가지고 할 수 있는 일은?
    5. 정확하게 소켓을 닫는 방법은 무엇인가?
    6. 언제 shutdown()을 써야 하는가?
    7. TIME_WAIT 상태에 대해 설명해 달라.
    8. 상대방쪽이 죽었는지 알아 내는데 왜 이렇게 오래 걸리나?
    9. select(), non-blocking I/O 그리고 SIGIO의 잇점들은 무엇인가?
    10. read()가 EPROTO 를 리턴했다. 무엇인가?
    11. 소켓 버퍼에 있는 내용을 강제로 전달 할 수 있는 방법은 없나?
    12. 소켓 프로그래밍을 위한 라이브러리가 있는가?
    13. select는 데이터가 있다고 하는데 읽으면 0을 리턴한다?
    14. select() 와 poll()의 차이점은 무엇인가?
    15. 어떻게 [this]를 소켓을 통해 보낼 수 있는가?
    16. TCP_NODELAY는 어떻게 사용하는가?
    17. Nagle 알고리즘은 어떤일을 하는 것인가?
    18. read() 와 recv()의 차이점은?
    19. send()/write()가 SIGPIPE 신호를 생성할 수 있던데. 이 신호를 무시하거나 EPIPE오류에 대한 검사를 하지 않고 다른 처리를 했을때의 어떤 잇점이 있는가? 시그널을 잡는 잡는 함수 에 넘겨지는 어떤 유용한 파라미터가 있는가?
    20. chroot()후에 socket()이 실패했다. 왜 그런가?
    21. 소켓 호출로 부터 전달되는 EINTR을 유지해야 하는 이유는 무엇인가?
    22. 언제 나의 프로그램이 SIGPIPE 신호를 받게 되는가?
    23. 소켓 예외는 있는가? out-of-band데이타란 무엇인가?
    24. 어떻게 완전한 내 시스템의 호스트이름인 (FQDN)을 얻을 수 있는가?
  3. 클라이언트 어플리케이션 만들기 (TCP/SOCK_STREAM)
    1. 문자열을 인터넷 주소로 바꾸는 방법은?
    2. firewall과 proxy서버를 통해서 클라이언트가 작동하도록 하려면 어떻게 하는가?
    3. 어떻게 서버가 accept()하지않았는데도 connect()가 성공할 수 있는가?
    4. 하나의 서버 이상을 사용하고 있을 때 왜 서버 주소를 가끔 잃어 버리는가?
    5. connect()를 위한 타임아웃시간을 설정할 수 있는가?
    6. 클라이언트 프로그램에서 포트번호를 갖기 위해 bind()를 써야 하는가 아니면 시스템이 connect()호출에서 선택하도록 해야 하는가?
    7. 왜 서버가 동작하고 있지 않을 때 "connection refused"라는 메시지가 나오는가?
    8. 소켓을 통해 들어오는 정보의 양을 모를 경우 어떻게 해야 하는가? 동적 버퍼를 사용할 수 있는 방법이 있는가?
  4. 서버 만들기 (TCP/SOCK_STREAM)
    1. bind()할 때 "address already in use" 메시지가 나왔는데 무슨의미인가?
    2. 왜 소켓을 닫을 수 없는가?
    3. 내 서버를 데몬으로 만들려면?
    4. 한번에 여러 포트로부터 listen할 수 있는가?
    5. SO_REUSEADDR 가 정확히 뭐하는 것인가?
    6. SO_LINGER 가 정확히 뭐하는 것인가?
    7. SO_KEEPALIVE 가 정확히 뭐하는 것인가?
    8. 포트 번호를 1024 이하로 bind()할 수 있는 방법은?
    9. 클라이언트의 주소와 호스트 이름을 알아내는 방법은?
    10. 나의 서버를 위한 포트번호를 어떻게 선택 해야 하는가?
    11. SO_REUSEADDR 와 SO_REUSEPORT 의 차이는 무엇인가?
    12. multi-homed server를 만드는 방법은?
    13. 한 번에 한 글짜식 읽는 방법은?
    14. 서버에서 exec()를 실행하고 그것에 소켓 I/O를 attach시키려고 하고 있다. 그런데 그것을 통하여 모든 그 데이터를 얻지 못하고 있다. 왜 그런가?
  5. UDP/SOCK_DGRAM 어플리케이션 작성
    1. TCP대신에 UDP는 언제 사용하는가?
    2. "connected" 소켓과 "unconnected"소켓의 차이는 무엇인가?
    3. connect() 호출이 소켓의 수신에 영향을 주는가?
    4. "connected" UPD 소켓으로부터 어떻게 하면 ICMP error를 읽을 수 있는가?
    5. 어떻게 UDP메시지가 수신 되었다는 것을 확신 할 수 있는가?
    6. UDP 메시지가 순서대로 도착했음을 확신할 수 있는가?
    7. 얼마나 자주 un-ack된 메시지에대해서 재전송 해야 하는가?
    8. How come only the first part of my datagram is getting
      through?
  6. 고급 소켓 프로그래밍
    1. 현재의 소켓 프로그램을 비블록킹 모드로 바꾸는 방법은?
    2. connect()의 타임아웃을 설정하는 방법은?
  7. 예제 소스 코드