2012-03-30 2 views
1

데이터를 수신자에게 계속 보내면 데이터가 버퍼에 누적되도록 데이터가 전송 될 수 있으므로 버퍼에 대한 다음 읽기도 다른 전송 된 데이터의 데이터를 읽는 것이 가능합니다 ?버퍼에서 TCP 데이터가 중복 될 수 있습니까?

Qt와 readAll()을 사용하여 데이터를 수신하고 구문 분석합니다. 이 데이터는 데이터가 이미 완성되었거나 유효한 데이터인지 알 수 있지만 다른 데이터가 readAll()이라고 부르면 다른 데이터와 겹치기 때문에 걱정이됩니다. 유효한 데이터 여야합니다.

일어날 수있는 경우 어떻게 방지/제어해야합니까? 또는 OS/API가 대신 염려하는 것입니까? 메서드 호출 방법 때문에 부분적으로 걱정이됩니다. lol

+5

8 개월, 18 질문, ** 0 투표 **. 함께 이동. – cnicutar

+0

'readAll'이 자체 버퍼를 손상 시킨다면 (당신이 묘사하고있는 것), 쓸모가 없습니다. – Mat

+0

손상된 버퍼가 있다는 것이 무슨 뜻인지 잘 모르겠습니다. 내가 보는대로, 그것은 데이터가 들어감에 따라 채워지는 연속적인 메모리 라인 일뿐입니다. – lightburst

답변

0

http://qt-project.org/doc/qt-4.8/qiodevice.html#readAll에 따르면이 함수는 모든 데이터를 snarfs하고 배열로 반환합니다. API가 중복 데이터에 대한 우려를 제기하는 방법을 모르겠습니다. 배열은 값에 의해 반환되며, 전체 스트림을 나타내므로 무엇과 겹치지 않습니까? 반환 된 객체에 실제로 참조 기능이 있다고 걱정합니까? (예 : 동일한 함수에 대한 다른 호출에서 다시 사용되는 저장소에 대한 포인터 만 보유하고 있습니다.)

모든 시스템에서 보내기 및 수신 버퍼가 겹치는 경우 버그. 사용법이 완전히 직렬화되어 있다는 특별한주의가없는 한. (즉, 버퍼는 어떤 용도로만 사용되며 믹스 업 없이는 전송 용으로 만 사용됩니다.)

+0

계속해서 데이터를 수신자에게 지속적으로 보내는 발신자가 있으면 수신자가 버퍼를 읽을 때 수신자가 수신자에게 보내진 데이터가 개별 문자열이라면, string1은 수신자에 의해 string2 중 일부와 함께 읽혀질 것입니까? – lightburst

+0

"중첩"이 아닌 구분/프레임 문제에 대해 설명하는 것처럼 들립니다.이 함수는 전체를 읽습니다 스트리밍 끝까지, 그래서 string1과 string2 버퍼에있을 것입니다. – Kaz

0

고정 길이 헤더 뒤에 가변 길이 패킷을 사용하고 패킷의 길이 정보를 보유하는 헤더를 사용하지 않는 이유는 무엇입니까?

이렇게하면 패킷 경계에 대한 걱정을 피할 수 있습니다. 예를 들어 단순히 문자열을 보내는 대신 문자열의 길이 뒤에 문자열을 보내라고 말하십시오. 수신 측에서는 항상 길이를 읽은 다음 길이를 기준으로 문자열을 읽습니다.

1

TCP는 패킷 기반 연결이 아니기 때문에 스트림 기반 연결이므로 한 번에 전송 된 내용이 한 번에 수신된다는 가정을하지 않을 수도 있습니다. 스트림을 패킷 화하려면 프로토콜 종류가 필요합니다.

문자열 전송의 경우, 문자를 구분 기호로 사용할 수도 있고, 마술과 길이가있는 머리글로 시작할 수도 있습니다.

관련 문제