더북(TheBook)

send()는 호출이 성공하면 전송한 데이터의 길이를 리턴한다. 이 값이 len에 지정한 값보다 작다면, 소켓의 전송 버퍼가 전부 보내기에는 모자라서 여유 공간 만큼만 잘라 보냈다는 뜻이다. 공간이 아예 없다면 디폴트로 호출 스레드는 블로킹되어 시간이 초과되거나 혹은 패킷을 몇 개 보낸 결과 공간이 만들어질 때까지 기다린다. 에러가 있다면 send()는 -1을 리턴한다. 양수 값이 리턴되었다 해서 데이터 전송이 완료되었다는 것은 아니며, 전송 대기열에 등록되었다는 정도로 이해해야 한다.

연결된 TCP 소켓으로 데이터를 받으려면 recv() 함수를 호출한다.

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

buf는 데이터를 복사해 넣을 버퍼를 가리킨다. 데이터를 복사하고 나면 해당 데이터는 소켓 내부의 수신 버퍼에서 제거된다.

len은 버퍼에 넣을 수 있는 데이터 크기의 상한선이다.

flags는 데이터 수신을 제어하는 비트 플래그이다. recvfrom()에 지정할 수 있는 플래그를 여기에도 쓸 수 있다. 일반적인 게임 코드에선 0으로도 충분하다.

recv() 호출이 성공하면 수신한 바이트의 길이를 리턴하는데, 이는 len보다 작거나 같은 값이 된다. send()를 한 번 호출해서 일정 길이의 바이트를 보냈을 때, 상대편이 recv()를 호출 시 똑같은 길이를 받는다고 보장할 수 없다. 보내는 측의 네트워크 라이브러리가 적당한 크기가 될 때까지 데이터를 모아두었다 한 번에 보낼 수도 있기 때문이다.

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