더북(TheBook)

상대방에게 TCP 접속 역할을 하는 connect() 함수를 논블로킹으로 쓸 때는 조금 다릅니다. 송수신 함수를 논블로킹으로 실행했을 때 would block이 리턴되면, 소켓 안에서는 아무 일도 일어나지 않습니다. 그러나 connect() 함수가 논블로킹 모드에서 실행될 때 would block이 리턴되었다면 소켓 안에서는 이미 무슨 일이 일어난 상태입니다. 소켓은 상대방의 TCP 연결 끝점으로 연결을 시도하다가 would block이 된 것이므로 소켓은 이미 ‘연결 과정이 진행 중인 상태’로 변합니다. 이러한 상태 변화 후 would block이 있었으니, connect()를 또 시도하는 것은 어딘가 꺼림직합니다. 물론 시도 자체가 나쁘지는 않습니다만, 이때 리턴되는 코드는 운영체제마다 조금씩 다를 수도 있습니다.4

따라서 논블로킹 연결 함수가 would block을 리턴한 후에는 would block이 끝났는지 알고자 다른 방법을 사용하는 것이 좋습니다. 여러 가지 방법이 있겠지만 ‘0바이트 송신’이라는 요령이 있습니다. TCP는 스트림 기반 프로토콜이기 때문에 0바이트를 보내는 것은 사실상 아무것도 하지 않는 셈입니다. 그리고 0바이트를 보내려는 시도를 하면 TCP 소켓이 현재 어떤 상태인지 알 수 있습니다.

• 0바이트 송신하는 함수가 ‘성공’을 리턴하면 TCP 연결되어 있다는 의미입니다.

• ENOTCONN(소켓이 연결되어 있지 않음)을 리턴하면 TCP 연결이 진행 중입니다.

• 기타 오류 코드가 나오면 TCP 연결 시도가 실패한 것입니다.

 

4 윈도나 리눅스 등 대부분 운영체제는 would block, “이미 연결되었음”, “연결이 실패했음” 중 하나를 리턴합니다. 하지만 Marmalade나 안드로이드 중 일부 운영체제에서는 상황에 따른 리턴 값이 조금씩 다를 수도 있습니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.