今天原本打算把tcp实现客户端往服务器收发文件的功能给实现的,本以为客户端用QT写可以省去很多细枝末节的操作,谁知到还是踩了坑。开门见山,具体踩坑的地方在使用TcpSocket的write函数往服务器写数据。
QByteArray line = file.readLine();
QTcpSocket* file_sock;
file_sock->write(line.toStdString().c_str());
服务器收到的一些文件大小比实际要小,搞了一下午没解决,只好找老师远程协助了。老师三下五除二就搞定,给出的解决方案如下:
QByteArray line = file.readLine();
QTcpSocket* file_sock;
file_sock->write(line.toStdString().c_str(),line.size());
为什么会这样呢?大体意思就是在QT中,如果不向write函数传入数据大小line.size(),当读入的数据line中存在’\0’时,'\0’以及后面的字符会被截断,导致发送的数据不完整。比如一串数据line =“abcd\0efg”,如果不往write中传入line.size(),那么实际发送的数据就是"abcd"。
这是老师说的,不对的话你去骂他,还有麻烦把你的正确答案告诉我哈,友好交流,不要吵架!