난 그냥 C에서 소켓/네트워크 프로그래밍을 배우고 있고, recv()
함수가 예기치 않은 동작을 일으키는 상황에 처해있다.C에서 recv()와 혼동되면 기본 입력 버퍼가 있습니까? 데이터는 어디서 오는가?
bytes_received = recv(connected, recv_data, 5, 0);
recv_data
는 5 바이트의 버퍼입니다 :
나는 설정된 소켓 서버 프로그램 등과 같은 recv()
를 호출합니다.
내 클라이언트 프로그램은 데이터를 보내기 위해 send()
을 사용합니다. 송신 버퍼는 1024 바이트입니다. 표준 입력에서 읽었으므로이 실험 중 1-10 바이트 사이에 문자를주고있었습니다.
내 recv()
전화가 5 바이트의 버퍼를 사용하여 5 바이트의 제한을 적용하더라도, 난 여전히 5 개 이상의 바이트를 보낼 수 있음을보고하고있어 그냥 서버 측에서 어딘가에대기열 것 같은 다음 번에 recv()
이 호출되면 (예 : 루프) 들어오는 데이터의 다음 5 바이트를 수신합니다.
나의 이해는 이 데이터를 발사한다는 것이었지만 (12 바이트라고 말하면 됨), recv()
은 5 바이트를 처리하기 위해 "설정"되어 있기 때문에 마지막 7 개는 손실됩니다. 서버가 어디에서 가져 오는 것입니까? recv()
에서 데이터를 팝하는 소켓 레벨에 기본 입력 버퍼가 있습니까?
나는 이것이 (기본 버퍼 메커니즘과 비슷한) 것이라고 생각했습니다. 그것의 TCP 소켓이라면, 확실하게 (프로그램에 알려지지 않은) 수신자쪽에 안정적으로 버퍼 될 수있는 데이터의 양에 대한 상한이 있습니까? 또는 클라이언트/발신자 시스템 아웃 바운드 소켓에서 재전송 된 데이터가있는 TCP 프로토콜 핸들을 저장할 수없는 경우이 인스턴스입니까? 감사! – csjohn
@csjohn 예, 운영 체제의 버퍼 크기에는 제한이 있습니다. 하지만 TCP 프로토콜을 사용하면 보낸 사람이 버퍼에 맞지 않는 데이터를 다시 보내도록 요청할 수 있습니다. 다시, 운영체제는 이것을 당신에게 투명하게 처리한다. 그래서'recv'는 마술처럼 작동 할 것이다. – amalloy
예 커널의 TCP 소켓 구현이 ACK를 처리하고 다시 전송합니다. 또한 운영 체제는 송신자와 수신자 모두에서 버퍼를 유지합니다. 송신 측에서 버퍼가 꽉 차면'send'는 수신자가 버퍼로부터 해제 할 수있는 패킷의 수신을 확인 할 때까지 차단 될 것이다. 수신 측에서는 애플리케이션이'recv'를 호출 할 때까지 수신 버퍼는 제거되지 않는다. – Tuxdude