QT 사용 시 TCPScoket 패킷 송수신, 데이터 오류 문제

1704 단어
	 :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;}
	 , , 。 , 。 。

좋은 웹페이지 즐겨찾기