C ++ WinSock发送文件

时间:2018-08-28 17:22:20

标签: c++ winsock ifstream

最近,我被分配了一个客户端/服务器项目,该项目基本上是一个聊天室,可以在其中发送和接收文件,并且我们可以使用网络摄像头。 我目前正在研究文件传输部分,在看了一些在线教程之后,我注意到它们中的大多数都使用偏移量写入缓冲区,然后将整个缓冲区写入新文件。

要复制这种代码,我设置了2个缓冲区,一个在客户端,另一个在服务器端。在服务器端,我从文件读取8192字节到缓冲区,然后将其发送到客户端,客户端将接收它,并将其添加到缓冲区。问题是,在第二次文件传输之后,它执行的每一次传输都是SOCKET_ERROR,这可能意味着有些不对劲。

服务器:

std::ifstream readFile;
        readFile.open(FileName, std::ios::binary | std::ios::ate);
        if (!readFile)
        {
            std::cout << "unable to open file" << std::endl;
        }
        int FileSize = readFile.tellg();
        readFile.seekg(0);
        int remainingBytes = 0;
        uint32_t FileSize32t = (uint32_t)FileSize;

        FileSize32t = htonl(FileSize32t);
        send(connections[ID], (char*)&FileSize32t, sizeof(uint32_t), 0);
        int sent_bytes = 0;
        int offset = 0;
        char data[8192];
        remainingBytes = FileSize;
        int i = 0;
        while (i<6)
        {
            readFile.read(data, 8192);
            if (remainingBytes < 8192)
            {
                sent_bytes = send(connections[ID], data+offset, remainingBytes, 0);
                remainingBytes -= sent_bytes;
                offset += sent_bytes;
            }
            else
            {                   
                sent_bytes = send(connections[ID], data+offset, 8192, 0);
                if (sent_bytes == SOCKET_ERROR)
                {
                    std::cout << "erro" << std::endl;
                }
                remainingBytes -= sent_bytes;
                offset += sent_bytes;
                std::cout <<"offset: "<< offset << std::endl;
                std::cout << "Sent bytes: " << sent_bytes << std::endl;
                std::cout << "remaining bytes: " << remainingBytes << std::endl;
            }       
            i++;
        }

客户:

char data[8192];
        std::ofstream writeFile;
        writeFile.open("Putin.jpg", std::ios::binary);
        int bytesReceieved = 0;
        int totalBytesReceieved = 0;
        int i = 0;
        while (i<6)
        {

            if (recvFileSize - totalBytesReceieved < 8192)
            {
                bytesReceieved = recv(connection, data+totalBytesReceieved, recvFileSize - totalBytesReceieved, 0);
                totalBytesReceieved += bytesReceieved;
            }
            else
            {
                bytesReceieved = recv(connection, data + totalBytesReceieved, 8192, 0);
                totalBytesReceieved += bytesReceieved;
                std::cout << totalBytesReceieved << std::endl;
            }   
            i++;
        }
        writeFile.write(data, totalBytesReceieved);
        std::cout << "transferência terminada, bytes recebidos: " << totalBytesReceieved << std::endl;

        writeFile.close();

请注意,这只是一个测试程序,这是我与C ++的首次互动之一。有人告诉我这可能不是从C ++开始的最佳方法,但是我需要在9月15日之前完成此任务,所以无论如何我都需要完成它。如果您发现除了我的原始问题之外的任何错误或问题,请随时指出,如果可以,请向我解释原因。

非常感谢您的帮助。

0 个答案:

没有答案