踏雪亦无痕 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条)

报告相同问题?

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料