2009년 10월 26일

비블록(non-block) 모드의 connect()는 상당히 복잡하다.

실제로 연결이 성공 되었는지 여부를 나중에 확인해야 하기 때문이다. 블록 모드 소켓에서 connect()는 연결이 완료되거나, 연결이 될 수 없음(에러)이 확실이 정해지면 리턴된다.

비블록 소켓은 연결이 완료되기를 기다려주지 않는다. 비블록 모드에서 가장 쉽게 구현되는 경우는 connect()를 호출하자마자 즉시 연결이 완료되고, 유효한 소켓을 생성하는 경우이다. 그러나, 이러한 상황은 거의 발생하지 않는다. 비블록 모드에서 connect()는 연결이 완료되지 않더라도 즉시 리턴된다. 따라서, 이 함수가 리턴되었을 때에는 반드시 먼저 리턴값을 체크해야 한다.

리턴값이 0이면 블록 모드의 소켓의 연결과 동일한 상황(거의 발생하지 않음)이 된 것이다.
이 경우에는 sockfd를 유효한 소켓으로 간주하고 구현하면 된다. 문제는 이 함수의 리턴값이 (-1)인 상황이다. 이 경우에는 반드시 errno 값을 검사해야 한다.

connect() 함수의 파라미터값들에 문제가 없다면 conect() 함수는 연결을 시도하게 되고, 연결의 성공여부와 관계 없이 리턴된다. 리턴값이 (-1)이고, errno가 EINPROGRESS 라면, 연결 작업이 이루어지고 있는 상태에서 connect() 함수가 리턴된 것이다.

비블록 모드의 소켓에서는 연결 완료와 무관하게 바로 리턴되는 방식으로 동작한다. 이 경우에는 어느 정도의 시간이 흐른 후에 실제로 연결이 완료 되었는지를 검사해야 한다.

연결 완료를 검사하는 몇 가지 방법이 존재하지만, 비교적 간단한 방법은 sockfd 소켓에 데이터를 전송할 수 있는, "쓰기가능" 상태인지를 검사하는 것이다. 쓰기가능 상태를 검사하려면 epoll() 또는 select()를 이용할 수 있다.

이 함수에 sockfd 값을 등록하면 쓰기가능이 되었을 때 바로 알려준다.(소켓이벤트 처리기법)

댓글 없음:

댓글 쓰기