• 8565阅读
  • 3回复

Linux C服务器程序如何接收QT客户端发送的TCP数据 [复制链接]

上一主题 下一主题
离线zono
 
只看楼主 倒序阅读 楼主  发表于: 2011-04-07
大家好,我参照 网上的例子 写了一个QT客户端程序,想给服务器传文件,服务器上的监听程序用C写,一切正常,但是服务端接收数据是前三个应该是
qint64(文件大小+文件名长度), qint64(文件名长度), QString
所以我在服务端read 8个字节,然后再8个字节,想把前两个数据读取到,但是怎么读取都是0,略过这两步,又发现读到的文件名每个字符之间都有一个\0,导致输出一个字符就结束输出,略过前三步,我也不知道具体是多少个字节,所以我就直接读34个字节,然后扔掉,继续再读真正要发送的文件数据,发现文件内容数据是正常的。

具体到Linux环境下的C程序,前面的头到底应该怎样接收和解析啊?
我已经在网上搜索了整2天也没找到一个结果,所以没办法,只能发帖请教大家了,还望能给我几个关键字,好让我能知道大概出问题的地方,并继续查找走下去。

万分感谢!

QT客户端组织并发送头数据的相关代码:
    QDataStream sendOut(&outBlock,QIODevice::WriteOnly);
    sendOut.setVersion(QDataStream::Qt_4_6);
    QString currentFileName = fileName.right(fileName.size() - fileName.lastIndexOf('/')-1);
    sendOut<<qint64(0)<<qint64(0)<<currentFileName;
    //依次写入总大小信息空间,文件名大小信息空间,文件名
    totalBytes += outBlock.size();
    //这里的总大小是文件名大小等信息和实际文件大小的总和
    sendOut.device()->seek(0);
    sendOut<<totalBytes<<qint64((outBlock.size() - sizeof(qint64)*2));
    //返回outBolock的开始,用实际的大小信息代替两个qint64(0)空间
    bytesToWrite = totalBytes - tcpClient->write(outBlock);
    //发送完头数据后剩余数据的大小
离线w45858646
只看该作者 1楼 发表于: 2011-04-07
我直接在qt里用c写了个socket客户端,qt的socket弄不太明白  
离线wxj120bw

只看该作者 2楼 发表于: 2011-04-07
引用第1楼w45858646于2011-04-07 16:44发表的  :
我直接在qt里用c写了个socket客户端,qt的socket弄不太明白  

先qt的socket能跟c进行通讯,楼主在网络传输时注意网络字节顺序了吗
离线edsionte
只看该作者 3楼 发表于: 2011-04-13
引用第2楼wxj120bw于2011-04-07 21:13发表的  :
先qt的socket能跟c进行通讯,楼主在网络传输时注意网络字节顺序了吗





qt的socket和C的socket可能有字节不同。因为我传输的字符都是乱码。
快速回复
限100 字节
 
上一个 下一个