以下是一个使用UDP和TCP进行文件传输的C++示例代码:

使用UDP进行文件传输:

// UDP 文件传输 - 发送端

#include <iostream>
#include <fstream>
#include <cstring>
#include <arpa/inet.h>

#define MAX_BUFFER_SIZE 1024

int main()
{
    std::string filename = "file.txt";
    std::string serverIP = "127.0.0.1";
    int serverPort = 12345;

    // 打开文件
    std::ifstream file(filename, std::ios::binary);
    if (!file)
    {
        std::cerr << "无法打开文件" << std::endl;
        return 1;
    }

    // 创建 UDP 套接字
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0)
    {
        std::cerr << "无法创建套接字" << std::endl;
        return 1;
    }

    // 设置服务器地址和端口
    struct sockaddr_in serverAddr{};
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons(serverPort);
    inet_pton(AF_INET, serverIP.c_str(), &(serverAddr.sin_addr));

    // 发送文件内容
    char buffer[MAX_BUFFER_SIZE];
    while (file)
    {
        file.read(buffer, MAX_BUFFER_SIZE);
        ssize_t bytesRead = file.gcount();
        ssize_t bytesSent = sendto(sockfd, buffer, bytesRead, 0, (struct sockaddr *)&serverAddr, sizeof(serverAddr));
        if (bytesSent < 0)
        {
            std::cerr << "发送数据失败" << std::endl;
            break;
        }
    }

    // 关闭套接字和文件
    close(sockfd);
    file.close();

    return 0;
}
// UDP 文件传输 - 接收端

#include <iostream>
#include <fstream>
#include <arpa/inet.h>

#define MAX_BUFFER_SIZE 1024

int main()
{
    std::string filename = "received_file.txt";
    int port = 12345;

    // 创建 UDP 套接字
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0)
    {
        std::cerr << "无法创建套接字" << std::endl;
        return 1;
    }

    // 绑定本地地址和端口
    struct sockaddr_in localAddr{};
    localAddr.sin_family = AF_INET;
    localAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    localAddr.sin_port = htons(port);
    if (bind(sockfd, (struct sockaddr *)&localAddr, sizeof(localAddr)) < 0)
    {
        std::cerr << "绑定地址和端口失败" << std::endl;
        return 1;
    }

    // 打开文件
    std::ofstream file(filename, std::ios::binary);
    if (!file)
    {
        std::cerr << "无法创建文件" << std::endl;
        return 1;
    }

    // 接收文件内容
    char buffer[MAX_BUFFER_SIZE];
    ssize_t bytesRead;
    while ((bytesRead = recvfrom(sockfd, buffer, sizeof(buffer), 0, nullptr, nullptr)) > 0)
    {
        file.write(buffer, bytesRead);
    }

    // 关闭套接字和文件
    close(sockfd);
    file.close();

    return 0;
}

使用TCP进行文件传输:

// TCP 文件传输 - 服务器端

#include <iostream>
#include <fstream>
#include <cstring>
#include <arpa/inet.h>

#define MAX_BUFFER_SIZE 1024

int main()
{
    std::string filename = "file.txt";
    int port = 12345;

    // 打开文件
    std::ifstream file(filename, std::ios::binary);
    if (!file)
    {
        std::cerr << "无法打开文件" << std::endl;
        return 1;
    }

    // 创建 TCP 套接字
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0)
    {
        std::cerr << "无法创建套接字" << std::endl;
        return 1;
    }

    // 设置服务器地址和端口
    struct sockaddr_in serverAddr{};
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    serverAddr.sin_port = htons(port);

    // 绑定地址和端口
    if (bind(sockfd, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0)
    {
        std::cerr << "绑定地址和端口失败" << std::endl;
        return 1;
    }

    // 监听连接
    if (listen(sockfd, 1) < 0)
    {
        std::cerr << "监听连接失败" << std::endl;
        return 1;
    }

    // 等待客户端连接
    struct sockaddr_in clientAddr{};
    socklen_t clientAddrLen = sizeof(clientAddr);
    int clientSockfd = accept(sockfd, (struct sockaddr *)&clientAddr, &clientAddrLen);
    if (clientSockfd < 0)
    {
        std::cerr << "接受客户端连接失败" << std::endl;
        return 1;
    }

    // 发送文件内容
    char buffer[MAX_BUFFER_SIZE];
    while (file)
    {
        file.read(buffer, MAX_BUFFER_SIZE);
        ssize_t bytesRead = file.gcount();
        ssize_t bytesSent = send(clientSockfd, buffer, bytesRead, 0);
        if (bytesSent < 0)
        {
            std::cerr << "发送数据失败" << std::endl;
            break;
        }
    }

    // 关闭套接字和文件
    close(clientSockfd);
    close(sockfd);
    file.close();

    return 0;
}
// TCP 文件传输 - 客户端

#include <iostream>
#include <fstream>
#include <arpa/inet.h>

#define MAX_BUFFER_SIZE 1024

int main()
{
    std::string filename = "received_file.txt";
    std::string serverIP = "127.0.0.1";
    int serverPort = 12345;

    // 创建 TCP 套接字
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0)
    {
        std::cerr << "无法创建套接字" << std::endl;
        return 1;
    }

    // 设置服务器地址和端口
    struct sockaddr_in serverAddr{};
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons(serverPort);
    inet_pton(AF_INET, serverIP.c_str(), &(serverAddr.sin_addr));

    // 连接服务器
    if (connect(sockfd, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0)
    {
        std::cerr << "无法连接服务器" << std::endl;
        return 1;
    }

    // 打开文件
    std::ofstream file(filename, std::ios::binary);
    if (!file)
    {
        std::cerr << "无法创建文件" << std::endl;
        return 1;
    }

    // 接收文件内容
    char buffer[MAX_BUFFER_SIZE];
    ssize_t bytesRead;
    while ((bytesRead = recv(sockfd, buffer, sizeof(buffer), 0)) > 0)
    {
        file.write(buffer, bytesRead);
    }

    // 关闭套接字和文件
    close(sockfd);
    file.close();

    return 0;
}

以上代码示例了如何使用UDP和TCP进行文件传输。UDP示例中,发送方将文件内容分段发送给接收方,接收方将接收到的数据写入文件。TCP示例中,服务器端先监听连接,客户端连接上服务器后,服务器将文件内容发送给客户端,客户端接收数据并将其写入文件。这些示例代码只是基本实现,不包含错误处理和完整性验证,实际使用时需要增加相关的代码

用udp和tcp知识写一个文件传输用c++

原文地址: https://www.cveoy.top/t/topic/iyGo 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录