QT 사용 시 TCPScoket 패킷 송수신, 데이터 오류 문제
:QT windows , linux
문제1: 이번 프로젝트는 QT로 데이터를 받습니다. 저는 Llinux 서버에서 사진 패키지를 보내서 분할 전송하는 방법을 사용합니다.그리고 QT 이쪽은 TCPsocket으로 수신하고 가방을 보내면 한 번 받고 파일에 적어서 저장합니다. 마지막 가방이 와서 파일을 닫을 때까지 그림을 전송할 수 있습니다.그리고 처음에는 매번 보내는 그림 데이터 1024바이트를 테스트하고crc로 검사합니다.전 코스는 별 문제가 없었고 전송이 너무 느려서 2048바이트를 전하고 싶었다.이번에는 5개의 가방을 전달했습니다. 다섯 번째 가방의 가방은 틀리지 않았습니다. 그러나crc검사 가방체, 즉 그림 데이터가 틀린 검사는 실패했습니다. 여섯 번째 가방부터 가방의 데이터까지 모두 틀렸습니다. 읽은 데이터는 매우 큰 랜덤으로 변했습니다.처음에 나는 내 코드 문제라고 생각했는데 내가 가서 찾아봤는데 오랫동안 찾아봤는데 코드에 아무런 문제가 없는 것 같았다. 왜냐하면 1024년에 전송해도 괜찮았기 때문이다.내가 자료를 찾아봤는데 QT라는 물건은 네가 한 번에 전송하는 데이터가 클수록 그가 가득 찰 확률이 적다는 것을 발견했다. 예를 들어 네가 4000바이트를 전송하면 그는 한 번에 2500을 받고 다시 1500을 받을 수도 있다.그래서 함수를 다시 받으면 매번 그렇게 큰 바이트를 받는다고 쓰는데, 아마도 그가 이번에 받은 바이트는 아예 그렇게 많지 않을 것이다.이때 당신이 읽은 것을 조작하기 때문에 오류가 발생하여 프로그램이 붕괴될 가능성이 높다.문제2: 가방 분실 문제로 서버에서 1000개의 가방을 보냈는데 클라이언트가 900개를 받으면 받지 않습니다.문제2 분석: 실험을 통해 tcp는 대역폭 제한으로 인해 가방을 잃어버리지 않는 한 안정적이다.내가 이번에 이 문제에 부딪힌 것은 내가 읽는 방법은 신호와 홈으로 qtcpsocket의readyread신호를 연결하는 것이다. 바로 데이터가 있으면 촉발되는 신호이기 때문이다.그리고 슬롯 안에서read로 데이터를 꺼내세요.읽은 후에 작업 시간이 있기 때문에 읽는 속도가 서버가 보내는 속도에 더 미치지 못한다. 그리고 서버가 1000개의 패키지를 보낸 후에 발송을 멈추면 클라이언트는 900개의 패키지만 수신 처리한다.나머지 가방은 버퍼에서 꺼내지 않았습니다.해결 방법: tcp의 송수신 작업을 위한 라인을 다시 엽니다. (여기 주의하십시오. tcp와 관련된 작업은 창설, 읽기, 쓰기 등 모든 것을 라인에 넣어서 하는 것이 좋습니다. 그렇지 않으면 크로스라인에서 tcp를 사용하는 문제 프로그램이 비정상적으로 종료됩니다.) 그리고 창설된 후에 tcpSocket->waitForReadyReady(900)를 사용합니다.괄호 안에 대기 시간을 조정할 수 있습니다. 이 대기 기간에 신호를 받으면 기다리지 않습니다. 직접read로 데이터를 읽을 수 있습니다. 그렇지 않으면 대기 후에 데이터를 주동적으로 읽고read의 반환 값이 >=0인지 확인하십시오.데이터가 있는지 아닌지를 판단하다.tcpSocket->waitForReadyRead(900); ret=tcpSocket->read((char *)Head_Read,sizeof(HEADER_T));//패키지 헤더 메시지 수신 if (ret<=0) {continue;}
, , 。 , 。 。
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.