더북(TheBook)

3.5.1 연결된 소켓으로 데이터 보내고 받기

연결된 TCP 소켓은 원격 호스트의 주소 정보를 간직하고 있다. 덕분에 호출자는 매 데이터 전송 시마다 주소 정보를 일일이 넘겨주지 않아도 된다. TCP 소켓으로 데이터를 전송할 때는 sendto() 대신 send() 함수를 호출한다.

int send(SOCKET sock, const char* buf, int len, int flags);

sock은 데이터를 보내는 데 사용할 소켓이다.

buf는 스트림에 기록할 데이터가 담긴 버퍼이다. UDP와 달리 buf는 데이터그램이 아니며 한 번에 전송된다는 보장이 없다. 그 대신 데이터는 소켓의 외부 전송용 버퍼에 추가되었다가 이후 소켓 라이브러리에 의해 적당한 시기에 전송된다. 2장에서 설명한 대로 네이글 알고리즘이 켜져 있으면 최대 세그먼트 길이를 가득 채우기 전까지 전송되지 않는다.

len은 전송할 데이터의 바이트 수이다. UDP와는 달리 이 값을 링크 계층의 MTU보다 작게 잡을 필요가 전혀 없다. 소켓의 전송 버퍼에 자리가 있는 한 네트워크 라이브러리는 데이터를 모두 보낼 수 있으며, 이를 위해 데이터를 적당한 크기의 덩어리로 잘라서 보내게 될 것이다.

flags는 데이터 전송을 제어하는 비트 플래그이다. 게임 코드에선 대개 0으로 둔다.

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