2013-03-04 2 views
3

난 그냥 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()에서 데이터를 팝하는 소켓 레벨에 기본 입력 버퍼가 있습니까?

답변

4

커널 내부의 소켓 구현이 자동으로 처리합니다.

TCP 소켓이면 데이터가 손실되지 않습니다. 그것이 UDP 소켓이라면 버퍼 오버플로가 발생할 경우 데이터가 손실 될 수 있습니다.

+0

나는 이것이 (기본 버퍼 메커니즘과 비슷한) 것이라고 생각했습니다. 그것의 TCP 소켓이라면, 확실하게 (프로그램에 알려지지 않은) 수신자쪽에 안정적으로 버퍼 될 수있는 데이터의 양에 대한 상한이 있습니까? 또는 클라이언트/발신자 시스템 아웃 바운드 소켓에서 재전송 된 데이터가있는 TCP 프로토콜 핸들을 저장할 수없는 경우이 인스턴스입니까? 감사! – csjohn

+1

@csjohn 예, 운영 체제의 버퍼 크기에는 제한이 있습니다. 하지만 TCP 프로토콜을 사용하면 보낸 사람이 버퍼에 맞지 않는 데이터를 다시 보내도록 요청할 수 있습니다. 다시, 운영체제는 이것을 당신에게 투명하게 처리한다. 그래서'recv'는 마술처럼 작동 할 것이다. – amalloy

+2

예 커널의 TCP 소켓 구현이 ACK를 처리하고 다시 전송합니다. 또한 운영 체제는 송신자와 수신자 모두에서 버퍼를 유지합니다. 송신 측에서 버퍼가 꽉 차면'send'는 수신자가 버퍼로부터 해제 할 수있는 패킷의 수신을 확인 할 때까지 차단 될 것이다. 수신 측에서는 애플리케이션이'recv'를 호출 할 때까지 수신 버퍼는 제거되지 않는다. – Tuxdude

관련 문제