2011-02-19 4 views

답변

1

Recv는 성공적으로 수신 된 소켓에서 데이터를 가져옵니다. 그 일이 언제 일어 났는지 알려주지 않습니다. 즉 타임 스탬프가 없다.

시도한 솔루션 대신 해결하려는 문제 ("필요한 이유")를 자세히 설명 하시겠습니까? (또는 완전히 질문을 오해 한 적이 있습니까?)

+0

recv가 서버에서 보낸 IP 패킷 형태로 데이터를 가져올 수 있는지 궁금하지만 대신 동일한 버퍼에서 가능한 한 많이 얻는 것처럼 보입니까? – user3234

+1

질문이 명확하지 않습니다. 원시 IP 헤더에 액세스하려고합니까? 당신은'recv()'로 그렇게 할 수 없으며 완전한 IP 패킷 자체가 아닌 IP 패킷 내부로부터 데이터 페이로드만을 반환합니다. –

+0

@ user3234 : 예, recv는 개별 IP 패킷이 아닌 스트림으로 표시된 페이로드 데이터를 가져옵니다. (또는 데이터 그램 소켓에 대한 단일 메시지/패킷이지만 TCP를 지정했습니다.) 예를 들어 데이터가 잘못 수신 된 경우에도 시스템에서 적절하게 주문하고 recv는 항상 "다음"데이터를 가져옵니다. –

2

데이터 그램 소켓 (예 : UDP)에서 recv은 데이터 그램으로 데이터를 가져옵니다. 그러나 TCP는 스트림 모드 소켓이며 recv은 패킷을 고려하지 않고 바이트 콜렉션을 가져옵니다.

낮은 수준의 API를 사용하여 패킷을 가져올 수는 있지만 send 사이의 경계를보고 싶다면 패킷에 정보가 없습니다.

+0

메시지가 동시에 전송 된 경우 단일 패킷으로 전송되기 때문에? – user3234

+0

@user : Nagle은 나가는 데이터를 결합 할 수 있습니다. 대형 버퍼는 여러 패킷으로 분리 될 수 있고 패킷은 MTU 제한으로 인해 조각화 될 수 있으며 프록시는 데이터를 다시 버퍼 할 수 있습니다. Nagle이 비활성화 된 경우에도 재전송이 발생하면 (그러면 TCP가 대역폭을 관리하는 방식이기 때문에) 최대한 많은 데이터가 패킷에 압축됩니다. –

0

데이터를 수신하는 원격 컴퓨터에 자신의 코드가 데이터를 보내는 경우 ... 타임 스탬프를 보낸 후 데이터를 보내는 것과 같이 자신의 응용 프로그램 수준 데이터 형식을 만들 수 있습니다 (특정 숫자 바이트).

이 정보는 수신 측에서 추출 할 수 있습니다. 언급 된 연결이 TCP이기 때문에 ... 데이터는 UDP의 경우처럼 완전한 패킷이 아닌 스트림 형식입니다.

관련 문제