문서 정보
  • 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)
  1. 고급 소켓 프로그래밍
    1. 현재의 소켓 프로그램을 비블록킹 모드로 바꾸는 방법은?
    2. connect()의 타임아웃을 설정하는 방법은?

6. 고급 소켓 프로그래밍

6.1. 현재의 소켓 프로그램을 비블록킹 모드로 바꾸는 방법은?

Andrew Gierth (andrew@erlenstar.demon.co.uk):

기술적으로, fcntl(soc, F_SETFL, O_NONBLOCK), 이런식으로 쓰면 다른 파일 flag에 문제를 일으키게 되므로 쓰면 안된다. 일반적으로 이건 별 문제 없이 잘 동작하는데 이것은 이것 말고 다른 flag들(예를 들어 O_APPEND)등은 소켓에 별 다른 영향을 주지 않기 때문이다. 비슷하게, fcntl(soc, F_SETFL, 0)을 이용하여 블록킹 모드로 되돌릴 수 있다.

이것을 제대로 하려면, F_GETFL을 이용해 현재의 flag를 얻고, O_NONBLOCK flag를 설정하고 삭제한다.

그리고 이 flag는 원하는 방법으로 변경할 수 있다.

6.2. connect()의 타임아웃을 설정하는 방법은?

Gierth (andrew@erlenstar.demon.co.uk)

connect()에서 select()를 사용하는 방법을 이용하면 connect()호출에서 타임아웃을 설정할 수 있다.

우선, 소켓을 만들고 비블록킹 모드로 만들고, 그런다음 connect()를 호출하라. 3개의 가능성이 있다.

  • connect succeeds: 연결이 제대로 됨.(이것은 보통 같은 기계로 연결될때 발생된다)
  • connect fails: 뻔하죠?
  • connect 가 -1/EINPROGRESS를 리턴한다. 연결 시도가 시도 됐으나, 아직 완결되지 않았다.

만약 연결이 성공하면

  • 소켓은 쓰기가능으로 select()한다.(그리고 데이터가 도착하면 일기 가능하게 된다)

연결이 실패하면

  • 소켓은 읽기와 쓰기로 select 할 것이다. 그러나 read 또는 write는 연결 시도로부터 에러코드를 리턴할 것이다. 또한 getsockopt(SO_ERROR)를 사용하여 에러 상태를 얻을 수 있다-그러나 조심하라; 몇몇 시스템은 getsockopt()의 결과 파라메터안에 있는 에러코드를 리턴한다. 그러나 또한 다른 시스템들은(옳지 못하지만) getsockopt 호출 자체가 에러로 저장된 값을 에러로하여 실패하게 된다.

이것에 관한 예제 소스파일은 connect.c이다.