踏雪亦无痕 2017-08-18 07:11 采纳率: 100%
浏览 2498
已采纳

基于socket的文件传输

用MFC做的一个小的聊天工具,要实现一个文件传输的功能,但是用ios::binary打开文件后有些文件发送不了,只能够发送txt文本,不知道为什么会这样
debug的时候发现用来将要发送的文件内容读取的缓冲区里的内容是 无效的字符串 ,按道理来说用ios::binary打开的文件应该是统一的二进制流文件,但是为什么有些字符无法读到缓冲区(字符型数组)里呢?望大神能够指点一二

 char *sendData;  //定义一个缓冲区来装载文件内容
        while (true)  //进入死循环
        {
            sendData = new char[sendMsg_size]{ '\0' };  //为缓冲区分配空间并且初始化

            send_file.read(sendData, sendMsg_size - 2);  //使用read方法从文件中读取适当的内容,send_file是fstream的文件对象,已经和文件关联了

            for (int i = sendMsg_size - 1;i > 0;i--)  //这一个循环主要是将所有读入的内容向后移动一个位置,从而给缓冲区第一个位置空出来,然后用一个‘f’来表示这一段内容是一个文件的内容,因为这是一个聊天工具,所以想要用不同的消息的头来表示这个消息的性质
            {
                sendData[i] = sendData[i - 1];
            }
            sendData[0] = 'f';

            iResult = send(Client_socket, sendData, strlen(sendData), 0);  //send函数来发送装有文件内容的缓冲区
            if (iResult == SOCKET_ERROR)
            {
                pointer->MessageBox(_T("发送失败!"), _T("错误"), MB_OK | MB_ICONERROR);
                delete[]sendData;
                return 0;
            }  //异常处理

            delete[]sendData;  //这一轮发完之后就删除堆中的分配的空间

            while (recvData[0] != 'o');  //从客户端那里要发过来一个特定的消息才能够进入下一步,这是为了让服务器发送文件的速度和客户端接受文件并且写入的速度相符合
            recvData[0] = '\0';  //客户端接受好了后,服务器重置消息头

            if (send_file.peek() == EOF)
            {
                break;
            }  //如果读到文件尾的话就说明文件已经读完了,就可以跳出死循环了

        }
        sendData = "e";  //发送一个特定的消息给客户端,告诉它已经发完了
        send(Client_socket, sendData, strlen(sendData), 0);
        send_file.close();  //关闭文件
  • 写回答

2条回答 默认 最新

  • shen_wei 2017-08-18 09:13
    关注
    
        fstream fs("1.txt",ios::in | ios::binary);
        char cBuf[100] = {0};
        fs.read(cBuf,100);
        printf("%s",cBuf);
        fs.close();
    

    先测试数据的正确读写。。。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?