글 수 48
2008.05.18 22:06:30 (*.105.125.81)
44952
소켓 프로그래밍에 대한 매우 좋은 글이 있어서 소개합니다. 저도 소켓 프로그래밍을 하다 보면 책으로는 해소할 수 없는 궁금한 내용이 많습니다. 이렇게 간질간질한 곳을 시원하게 긁어 주는 "C에 의한 유닉스 소켓 프로그래밍 - FAQ" 라는 문서가 있어서 앞으로 몇 회로 나누어 올리려 합니다.
작성을 Vic Metcalfe, Andrew Gierth 와 이외 몇 분이 작성하고, 감사하게도 안창선(csan@coresw.co.kr) 이라는 분이 읽기 편하게 한글로 변역해 주셨습니다.
문서 정보에는 http://www.auroraonline.com/sock-faq/ 로 소개되어 있었습니다만 문서가 오래되서 인지 열리지 았습니다. 대신에 웹으로 검색해 보니 아래의 링크에서 FAQ 자료를 볼 수 있었습니다.
위 링크보다 더 최근의 문서와 더 활발한 활동을 하는 웹 페이지는 아직 모릅니다만 찾게되면 본 문서를 업데이트하겠습니다.
전체 목차를 보시면 과연 어떤 내용이 들어 있는지 한 눈에 아실수 있겠죠. 전체 목차입니다. 앞으로 문서를 모두 올리면 아래의 목차 모두에 링크를 걸어서 보다 편리하게 문서를 보실 수 있도록 하겠습니다.
목차
- 일반 정보와 개념
- 클라이언트와 서버 양쪽에 관한 질문 (TCP/SOCK_STREAM)
- 언제 상대방쪽 소켓이 끊겼는지 알 수 있는 방법이 있는가?
- bind()의 두 번째 파라메터는 무엇인가?
- 주어진 서비스의 port번호를 얻는 방법은?
- bind() 가 실패 했을 때 소켓 디스크립터를 가지고 할 수 있는 일은?
- 정확하게 소켓을 닫는 방법은 무엇인가?
- 언제 shutdown()을 써야 하는가?
- TIME_WAIT 상태에 대해 설명해 달라.
- 상대방쪽이 죽었는지 알아 내는데 왜 이렇게 오래 걸리나?
- select(), non-blocking I/O 그리고 SIGIO의 잇점들은 무엇인가?
- read()가 EPROTO 를 리턴했다. 무엇인가?
- 소켓 버퍼에 있는 내용을 강제로 전달 할 수 있는 방법은 없나?
- 소켓 프로그래밍을 위한 라이브러리가 있는가?
- select는 데이터가 있다고 하는데 읽으면 0을 리턴한다?
- select() 와 poll()의 차이점은 무엇인가?
- 어떻게 [this]를 소켓을 통해 보낼 수 있는가?
- TCP_NODELAY는 어떻게 사용하는가?
- Nagle 알고리즘은 어떤일을 하는 것인가?
- read() 와 recv()의 차이점은?
- send()/write()가 SIGPIPE 신호를 생성할 수 있던데. 이 신호를 무시하거나 EPIPE오류에 대한 검사를 하지 않고 다른 처리를 했을때의 어떤 잇점이 있는가? 시그널을 잡는 잡는 함수 에 넘겨지는 어떤 유용한 파라미터가 있는가?
- chroot()후에 socket()이 실패했다. 왜 그런가?
- 소켓 호출로 부터 전달되는 EINTR을 유지해야 하는 이유는 무엇인가?
- 언제 나의 프로그램이 SIGPIPE 신호를 받게 되는가?
- 소켓 예외는 있는가? out-of-band데이타란 무엇인가?
- 어떻게 완전한 내 시스템의 호스트이름인 (FQDN)을 얻을 수 있는가?
- 클라이언트 어플리케이션 만들기 (TCP/SOCK_STREAM)
- 문자열을 인터넷 주소로 바꾸는 방법은?
- firewall과 proxy서버를 통해서 클라이언트가 작동하도록 하려면 어떻게 하는가?
- 어떻게 서버가 accept()하지않았는데도 connect()가 성공할 수 있는가?
- 하나의 서버 이상을 사용하고 있을 때 왜 서버 주소를 가끔 잃어 버리는가?
- connect()를 위한 타임아웃시간을 설정할 수 있는가?
- 클라이언트 프로그램에서 포트번호를 갖기 위해 bind()를 써야 하는가 아니면 시스템이 connect()호출에서 선택하도록 해야 하는가?
- 왜 서버가 동작하고 있지 않을 때 "connection refused"라는 메시지가 나오는가?
- 소켓을 통해 들어오는 정보의 양을 모를 경우 어떻게 해야 하는가? 동적 버퍼를 사용할 수 있는 방법이 있는가?
- 서버 만들기 (TCP/SOCK_STREAM)
- bind()할 때 "address already in use" 메시지가 나왔는데 무슨의미인가?
- 왜 소켓을 닫을 수 없는가?
- 내 서버를 데몬으로 만들려면?
- 한번에 여러 포트로부터 listen할 수 있는가?
- SO_REUSEADDR 가 정확히 뭐하는 것인가?
- SO_LINGER 가 정확히 뭐하는 것인가?
- SO_KEEPALIVE 가 정확히 뭐하는 것인가?
- 포트 번호를 1024 이하로 bind()할 수 있는 방법은?
- 클라이언트의 주소와 호스트 이름을 알아내는 방법은?
- 나의 서버를 위한 포트번호를 어떻게 선택 해야 하는가?
- SO_REUSEADDR 와 SO_REUSEPORT 의 차이는 무엇인가?
- multi-homed server를 만드는 방법은?
- 한 번에 한 글짜식 읽는 방법은?
- 서버에서 exec()를 실행하고 그것에 소켓 I/O를 attach시키려고 하고 있다. 그런데 그것을 통하여 모든 그 데이터를 얻지 못하고 있다. 왜 그런가?
- UDP/SOCK_DGRAM 어플리케이션 작성
- TCP대신에 UDP는 언제 사용하는가?
- "connected" 소켓과 "unconnected"소켓의 차이는 무엇인가?
- connect() 호출이 소켓의 수신에 영향을 주는가?
- "connected" UPD 소켓으로부터 어떻게 하면 ICMP error를 읽을 수 있는가?
- 어떻게 UDP메시지가 수신 되었다는 것을 확신 할 수 있는가?
- UDP 메시지가 순서대로 도착했음을 확신할 수 있는가?
- 얼마나 자주 un-ack된 메시지에대해서 재전송 해야 하는가?
- How come only the first part of my datagram is getting
through?
- 고급 소켓 프로그래밍
- 예제 소스 코드