从套接字c ++发送和接收文件的问题

probleim with sending and receiving file from socket c++

我正在尝试将文件从服务器发送到客户端 我的服务器有这个功能:

UINT CServerDlg::sendFile(WPARAM pParam)
{
    if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
    {
        return FALSE;
    }
    else {
        if (AfxSocketInit() == FALSE)
        {
            return FALSE;
        }

        CSocket ServerSocket;
        if (ServerSocket.Create(Dport, SOCK_STREAM, NULL) == 0)
        {
            return FALSE;
        }
        else
        {
            if (ServerSocket.Listen(32) == FALSE)
            {
                ServerSocket.Close();
                return FALSE;
            }

        }


        CSocket Connector;
        if (ServerSocket.Accept(Connector))
        {
            char* buffer = NULL;

            FILE* fi = fopen(file_name.c_str(), "rb");
            if (!fi)
                return 0;

            //get the file length
            fseek(fi, 0, SEEK_END);
            long file_size = ftell(fi);
            fseek(fi, 0, SEEK_SET);

            //send packet's length first and then send the packet
            //(one file includes multiple packets) and SIZE_BUFFER=4096
            int result=-1;
            int size = (file_size < SIZE_BUFFER) ? (int)file_size : SIZE_BUFFER;
            while (file_size >= (long long)SIZE_BUFFER) {
                fread(buffer, size, 1, fi);
                result = send(Connector, (char*)&file_size, sizeof(int), 0);

                if (result == SOCKET_ERROR) return 0;
                do { size = send(Connector,buffer, size, 0); } while (size == -1);

                memset(buffer, 0, SIZE_BUFFER);
                file_size = file_size - (long long)size;
            }
            if (file_size != 0) {
                if (send(Connector, (char*)&file_size, sizeof(int), 0) == SOCKET_ERROR) return 0;
                fread(buffer, file_size, 1, fi);
                do { size = send(Connector,buffer, file_size, 0); } while (size == -1);

            }

            delete[] buffer;
            fclose(fi);
        }
        else {
            return 0;
        }
        Connector.Close();
        ServerSocket.Close();
    }
    return 1;
}

我在客户端文件中得到了这个:

bool MainDlg::DownloadFile(char* file_name, int port) {
    if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
    {
        // TODO: change error code to suit your needs
        return FALSE;
    }
    //copy tu demo
    if (AfxSocketInit() == FALSE)
    {
        return FALSE;
    }

    CSocket ClientSocket;
    ClientSocket.Create();

    if (ClientSocket.Connect(_T("127.0.0.1"), port) != 0)
    {
        char* buffer = NULL;
        int size = 0;
        FILE* fo = fopen(file_name, "wb");
        recv(ClientSocket, (char*)&size, sizeof(int), 0);
        while (size >= SIZE_BUFFER) {
            do { size = recv(ClientSocket, (char*)buffer, SIZE_BUFFER, 0); } while (size == -1);

            fwrite((char*)buffer, size, 1, fo);
            memset(buffer, 0, SIZE_BUFFER);
            size = recv(ClientSocket, (char*)&size, sizeof(int), 0);
        }
        if ((size != SOCKET_ERROR)) size = recv(ClientSocket, (char*)buffer, size, 0);
        else return 0;
        delete[] buffer;
        fclose(fo);
    }
    else {
        return 0;
    }
    ClientSocket.Close();
    return 1;
}

服务器和客户端连接上了,但似乎发送数据包失败。即使它发送失败但执行文件没有调用错误但是当我调试时它确实如此。我在 fread(buffer, file_size, 1, fi) 收到未知错误: Server.exe 中 0x00007FF6F17BDF28 处的未处理异常:将无效参数传递给认为无效参数致命的函数。

您必须为缓冲区分配内存,因为 fread 的第一个参数:

Pointer to a block of memory with a size of at least (size*count) bytes, converted to a void*.

使用malloc or new.

我建议使用 std::array 不用担心删除内存。