找回密码
 立即注册
收起左侧

请教关于TCP通讯问题

4
回复
7162
查看
[复制链接]
累计签到:96 天
连续签到:1 天
来源: 2014-4-2 10:03:09 显示全部楼层 |阅读模式
10Qter豆
PC -- 客户端
ARM -- 服务端

PC向ARM板通过TCP来发送文件,有个问题

PC端:发送部分代码 这里发送顺序是  文件名长度--文件大小--文件名
QDataStream sendOut(&outBlock, QIODevice::WriteOnly);
sendOut.setByteOrder(QDataStream::LittleEndian);

//获取文件名
QString currentFileName = fileName.right(fileName.size() - fileName.lastIndexOf('/')-1);

qDebug() << currentFileName;
qDebug() << currentFileName.length();

//依次写入总大小信息空间,文件名大小信息空间,文件名
sendOut << currentFileName.length() << totalBytes << currentFileName;

qDebug() << totalBytes;

tcpClient->write(outBlock);

//发送完头数据后剩余数据的大小
bytesToWrite = totalBytes - tcpClient->write(outBlock);

outBlock.resize(0);

-------------------------------------------------
ARM 这边接收的话,大概是这样的
while (1)
{
    printf("########################################\n");
    //文件名长度   
    if (bytes_received == 0)
    {
        cur_bytes_received = recv(*client_fd, buf, sizeof(int), 0);    //4个字节        
        if (cur_bytes_received <= 0)
        {
            send_msg(client_fd, ERROR);
            break;
        }   
        
        printf("%d\n", cur_bytes_received);
                    
        memcpy(&fileNameSize, buf, sizeof(int));
        printf("File Name Size:%d\n", fileNameSize);        
        
        bytes_received += cur_bytes_received;
        
        //break;
    }

    printf("########################################\n");
    bzero(buf, BUFFER_SIZE);
    //usleep(2000*1000);
   
    //文件大小   
    if (bytes_received == sizeof(int))
    {
        cur_bytes_received = recv(*client_fd, buf, sizeof(int), 0);
        if (cur_bytes_received <= 0)
        {
            send_msg(client_fd, ERROR);
            break;
        }   
        
        printf("%d\n", cur_bytes_received);
        memcpy(&totalBytes, buf, sizeof(int));
        printf("File size: %d\n",totalBytes);
        
        bytes_received += cur_bytes_received;            
        
        //break;
    }
   
    printf("########################################\n");
    bzero(buf, BUFFER_SIZE);
    bzero(filename, FILE_NAME_SIZE);
   
    //文件名
    if (bytes_received == sizeof(int)*2)
    {
        cur_bytes_received = recv(*client_fd, buf, fileNameSize, 0);
        if (cur_bytes_received <= 0)
        {
            send_msg(client_fd, ERROR);
            break;
        }   
        
        buf[cur_bytes_received] = '\0';
        memcpy(filename, buf, fileNameSize);
        
        printf("%d\n", cur_bytes_received);
        printf("buf:%s\n", buf);
        printf("File Name:%s\n", filename);

        bytes_received += cur_bytes_received;   
        
        break;            
    }
   
}   

文件名长度跟 文件大小,都能正常读取,但是文件名就是读取不了
输出结果是:
./server
Init Socket Success!
Waiting connect...
Waiting upgrade...
########################################
4
File Name Size:10
########################################
4
File size: 276626
########################################
10
buf:
File Name:
-------
读取返回是说读了10字节,但是里面是空的。

请教各位,感谢了~!

最佳答案

查看完整内容

提供一些想法,供参考: 1、文件名确定不是中文?如有中文建议改成纯英文试试; 2、QT和ARM开发板的编码是否一致? 如在Linux下做ARM开发,是否将输出从UTF-8转换成GBK18030输出(假定ARM开发板是GBK18030的情况下)? 以上2点是基于您提供的“文件名长度跟 文件大小,都能正常读取”信息考虑。。 祝好运! begboy ...
回复

使用道具 举报

尚未签到

2014-4-2 10:03:10 显示全部楼层
提供一些想法,供参考:
1、文件名确定不是中文?如有中文建议改成纯英文试试;
2、QT和ARM开发板的编码是否一致?
   如在Linux下做ARM开发,是否将输出从UTF-8转换成GBK18030输出(假定ARM开发板是GBK18030的情况下)?
以上2点是基于您提供的“文件名长度跟 文件大小,都能正常读取”信息考虑。。
祝好运!
begboy
回复

使用道具 举报

尚未签到

2014-4-2 11:14:56 显示全部楼层
是不是用了 readAll函数后又去读里面的内容?  readAll之后内容一般会清空的
回复

使用道具 举报

累计签到:96 天
连续签到:1 天
2014-4-2 11:36:24 显示全部楼层
没有呢,我也觉得挺奇怪的。还在调,现在想自己制定一些协议,不用QDataStream序列化了,如果都是QT程序的话,是没问题的。
回复

使用道具 举报

累计签到:96 天
连续签到:1 天
2014-4-3 17:13:18 显示全部楼层
begboy 发表于 2014-4-3 13:35
提供一些想法,供参考:
1、文件名确定不是中文?如有中文建议改成纯英文试试;
2、QT和ARM开发板的编码是 ...

之前是因为 QT用了 QDataStream来序列化数据包,arm这边不一定能读的准,后来我重新制定了简单的传输协议,就可以发送数据了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了