qq_35356972
踏雪亦无痕
2017-08-18 07:11

基于socket的文件传输

  • c++
  • mfc
  • 文件传输
  • 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条回答