글 수 48
2008.05.24 15:04:20 (*.105.125.81)
52892
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이다.