QTCPSocket 관련 질문입니다.
글쓴이: chobozzang / 작성시간: 월, 2013/11/25 - 2:05오후
안녕하세요. QTcpSocket 을 테스트하고 있는데요... 한 쓰레드에서 쓰기와 읽기를 동시에 하려고 하니 문제가 생깁니다.
최초 접속을 하면 2개의 패킷을 서버쪽에서 내려주는데 쓰는 도중에 패킷이 누락되는 듯 합니다. 쓰는 부분을 주석처리하면 로그가 제대로 찍히는 데요. 주석을 풀게되면 1패킷의 로그가 누락되어집니다 ㅠㅠ. 서버모듈이 잘못되었나 wireshark를 이용해 찍어보니 패킷은 정확히 들어오구요... 다만 QT 쪽 client에서 패킷을 제대로 못읽어 오는 것 같아서요. 이 부분을 어떻게 해야할 지요 ㅠㅠ 혹시 제 소스코드에 문제가 있는지 문제점 지적 및 같은 증상을 겪으신 분은 답변 좀 부탁드리겠습니다.
관련 소스코드입니다. 쓸때는 데이터를 deque 에 넣어줘서 queue에서 하나씩 뺴서 쓰레드에서 처리하는 방식입니다. 처리하는 걸 확인할 떄는 qDebug() 를 이용해 print 하고 있습니다.
void sockThread::run() { //qDebug() << "sockThread thread start"; QTcpSocket cli; cli.connectToHost(ip, port); if(!cli.waitForConnected(100000)) { qDebug() << "Error: " << cli.errorString(); return; } while(!stopped) { size = 0; if(cli.waitForReadyRead(10000)) { size = cli.read(buff, MAXLEN); if(size > 0) dist_packet(buff, size); } /* if(!send_queue.empty()) { SendHeader s_header; memset(&s_header, 0, sizeof(SendHeader)); char* temp_write = (char*)&s_header; w_mutex.lock(); s_header = send_queue.front(); send_queue.pop_front(); w_mutex.unlock(); sleep(1); qDebug() << "write something" << s_header.cmd; cli.write(temp_write); } */ } cli.disconnectFromHost(); if(cli.waitForDisconnected(1000)) { qDebug() << __func__ << " Disconnected!!"; } }
Forums:
sleep(1)이 1 초 기다리는 건가요? Qt에서는
sleep(1)이 1 초 기다리는 건가요?
Qt에서는 아마 delay 였던 것 같은데 ... 지연을 줄 필요가 있나요?
지연을 주석처리하고 해 보세요.
ㅁㄴ
sleep 을 지우고해도 똑같은 현상이 발생하네요 ㅠㅠ wireshark에서는 패킷이 들어오는 게 찍힙니다... 서버쪽에서 term을 두지않고 막 쏘니 쓰는 부분을 주석처리해도 제대로 처리가 안되는 듯 합니다...
gilgil.net
size 값을 확인해 보세요.
www.gilgil.net
d
감사합니다. 초보자라 엄한곳 뒤지고 있었네요... tcp 통신에 대해서 잘 몰라서 1번 send 한 데이터는 receive 할 때 나눠져서 들어오는 줄 알았는데 붙어서도 들어오는군요... 덕분에 해결했습니다.
댓글 달기