더북(TheBook)

len에 0을 넣어 recv를 호출했는데 0이 리턴되면, 소켓에서 읽을 것이 있다는 뜻이다.8 읽기 작업에 버퍼를 할당하기 전 이 방법으로 소켓이 읽을 준비가 되었는지를 확인해 볼 수 있는데, 데이터가 있을 때만 버퍼를 할당하고 그 버퍼의 길이만큼 len을 잡아 recv()를 다시 호출하면 된다.

에러가 있으면 recv()는 -1을 리턴한다.

디폴트로 소켓의 수신 버퍼에 데이터가 아직 없는 경우, recv() 호출 시 호출 스레드가 블로킹되어 스트림상 다음 데이터 조각이 수신될 때까지, 혹은 시간이 초과될 때까지 기다린다.

Note ≣

TCP로 연결된 소켓에 sendto()recvfrom()을 쓸 수도 있다. 하지만 호출자가 지정한 address 인자가 무시되어 헷갈릴 것이다. 이와 유사하게 어떤 플랫폼은 UDP 소켓에 connect()를 호출하는 걸 허용하기도 하는데, 이렇게 하면 원격 호스트의 주소와 포트를 소켓 내부의 연결 데이터에 각인시키는 효과가 있다. 그렇게 한다고 실제 신뢰성 연결이 이루어지진 않지만, 대신 send() 함수로 데이터를 보낼 때 매번 주소를 넘겨줄 필요가 없게 된다. 또한, 들어오는 데이터그램 중 connect()에 지정하지 않은 주소 포트 조합의 것은 무시하게 만드는 효과도 있다.

 


 

8  역주 이렇게 동작하는 플랫폼도 있지만 표준에는 정의되지 않은 동작이므로 추천하지 않는다.

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