소켓에서 들어오는 데이터를 사용할 수 없는 경우 recv 호출 블록 및 WSARecv에 대해 정의된 차단 규칙에 따라 데이터가 도착할 때까지 기다립니다. 이 경우 WSAEWOULDBLOCK으로 설정된 오류 코드와 함께 SOCKET_ERROR 값이 반환됩니다. SELECT, WSAAsyncSelect 또는 WSAEventSelect 함수를 사용하여 더 많은 데이터가 도착하는 시기를 결정할 수 있습니다. 따라서 먼저 총 크기가 언급된 다음 2줄 이후에 실제 응답이 따르므로 클라이언트는 응답 부분에서 1024 바이트의 데이터가 수신될 때까지 기다려야 합니다. 예를 들어 http 서버가 보내는 http 응답에는 응답의 총 크기를 알려주는 “콘텐츠 길이” 값이 헤더에 있습니다. 매우 유용한 기사 주셔서 감사합니다. 코드를 시도했지만 수정 된 receive_basic() 코드가 recv_timeout (int s , int timeout) 함수를 멀리 할 수 있음을 발견했습니다. fcntl()으로 소켓을 비차단하는 대신 setockopt()를 사용하여 receive_basic()에서 원하는 시간 시간 값을 설정할 수 있습니다. 예를 들어 아래 receive_basic(int s_fd)은 1.5초 동안 기다렸다가 시간이 만료되고 모든 데이터를 수신할 수 google.com 48046바이트를 수신합니다. 서버가 패킷 크기를 보내지 않으면 프로그램은 전송이 완료되었는지 여부를 스스로 결정해야 합니다. 예를 들어 소켓 연결이 닫히거나 큰 시간 시간에 대해 수신된 데이터가 없는 경우입니다. 데이터그램 또는 메시지가 지정된 버퍼보다 큰 경우 버퍼는 데이터그램의 첫 번째 부분으로 채워지고 recv는 WSAEMSGSIZE 오류를 생성합니다. 신뢰할 수 없는 프로토콜(예: UDP)의 경우 초과 데이터가 손실됩니다.

신뢰할 수 있는 프로토콜의 경우 충분한 버퍼로 recv를 호출하여 성공적으로 읽을 때까지 서비스 공급자가 데이터를 유지합니다. 위의 예에서 소켓은 차단 유지 될 수있다. 그런 다음 recv 함수는 MSG_DONTWAIT 1 플래그를 사용해야 합니다. 예를 들어 2개의 연속된 줄 바선은 데이터의 끝을 나타낼 수 있습니다. 따라서 이 논리는 서버와 클라이언트 모두에서 코딩되어야 합니다.