더북(TheBook)

TCP 연결이 받아지면 새로운 socket이 생성되며, socket의 핸들 값이 리턴됩니다. 상대방 측과의 TCP 통신은 바로 이 새로운 socket으로 하는 것입니다. 새로운 socketlisten socket이 점유한 포트 값과는 다른 포트 값을 가집니다.

TCP 연결을 맺은 socket의 상대방 측 끝점을 보고 싶다면 getpeeraddr()를 호출하면 됩니다(). getsockaddr()를 호출하면 상대방 측이 아닌 이쪽 끝점 정보가 나옵니다.

앞서 TCP에서는 sendTo() 대신 send()를 호출하고, 이미 연결 상태이므로 끝점 정보를 넣지 않는다고 언급했습니다. 마찬가지로 TCP로 수신할 때는 recvfrom() 대신 recv()를 호출합니다(). 그러면 데이터를 얻을 수 있습니다.

또 UDP는 데이터그램을 메시지 형식으로 주고받는다고 말했습니다. 이때 메시지는 0바이트짜리 메시지도 허락합니다. 따라서 sendTo()로 0바이트 데이터그램을 보내면, 받는 쪽에서는 0바이트 데이터그램이 수신됩니다.

TCP는 스트림 형식입니다. 따라서 send()로 0바이트 데이터를 보내면, 사실 아무것도 하지 않는 것과 같습니다. 메시지 개념이 아니라 이어진 데이터, 즉 이름 그대로 스트림 형식이기 때문입니다. 그러다 보니 recv()에서 수신된 데이터 크기가 0바이트일 때는 다르게 취급합니다. TCP 소켓에 대해 recv()가 0바이트 수신하면 이는 ‘연결이 종료되었음’을 의미합니다. 다시 말해서 파일 액세스에서 언급되는 ‘끝(end of f ile)’과 같은 의미입니다. 따라서 이때는 연결이 끊어졌으므로 마감 처리를 해야 합니다(, ).

연결을 끊는 함수는 shutdown()이나 close()입니다. 송신자나 수신자가 이것을 호출하면 호출한 프로세스 안에 있는 recv() 함수는 0을 리턴하게 됩니다. 마찬가지로 상대방의 recv() 함수도 0을 리턴합니다.

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