도와주세요!!
제가 급하게 서버와 클라이언트 프로그램을 해야 하는뎅.. 좀 이해가 되지 않습니다..
서버 : QT - QServerSocket
클라이언트 : MFC - 다른 MFC 프로그램과 테스트 결과 보내고 받는것 이상 없습니다..
그런데 서버와 클라이언트 테스트를 해 보면 좀이상합니다..
1. 클라이언트 -> 서버 (클라이언트가 서버에게 메시지 보낼때)
- 클라이언트 쪽 -
CString m_strGetID = "0A";
CString strSendData;
strSendData = "1" + m_strGetID + "01";
if(m_bSendData){
// 데이타를 보냄 : 10A01
m_DataSocket->Send((LPCSTR)strSendData, strSendData.GetLength()+1);
strSendData = "SEND >> " + strSendData;
ViewRichEdit(strSendData); // RichEdit 박스에 보여준다.
}
- 서버 쪽 -
QTestStream ts(this);
while( canReadLine() ) // 확인해보니까 canReadLine 이 false 됩니다..
{
QString str = ts.readLine();
qDebug(str);
}
그래서 서버 쪽을 다음과 같이 변경하였습니다..
char buff[5];
memset(buff, 0x00, sizeof(buff));
int available = 0;
available = this->bytesAvailable();
qDebug("available %d" ,available);
int nlen = this -> readBlock(buff, available);
이렇게 하니까 서버 쪽에서 데이타를 읽어 들입니다.. 그런데 canReadLine 과 readBlock 무슨 차이가 있는 것가용?? 느낌에 blocking 과 not-blocking 차이 같은뎅..;; 정확히 개념이 잘 모르겠습니다..
2. 서버 -> 클라이언트 (서버에서 클라이언트로 데이타를 보낼때)
- 클라이언트 -
char temp[200];
memset(temp, 0x00, sizeof(temp));
m_DataSocket->Receive((LPSTR)temp, sizeof(temp)); // 데이타를 받는 부분
- 서버 -
QTextStream ts(this);
QString str = "30C03";
ts<<str;
이상하게 서버에서 데이타를 보낼때 writeBlock 로 보냄 클라이언트에서 데이타를 다 읽지 못하거나 이상하게 읽습니다. QTextStream 사용하면 정확히 읽어 들이구용.. QTextStream 이MFC 에서 파일을 저장하거나 네트워크에서 데이타를 쭉 보내고 받을때 시리얼라이즈(맞나?!)같은뎅..
결론은 소스가 일관성이 없이 서버에서 받을때는 readBlock 로 하고 보낼때는 QTextStram 해야 정확히 데이타를 주고 받습니다.. 소켓은 not-blocking 와 blocking 차이 같은뎅..
개념 좀 알려주세요..