legongju.com
我们一直在努力
2025-01-12 23:01 | 星期天

如何在Linux中使用socket进行文件传输

在 Linux 中,你可以使用 socket 编程进行文件传输

服务器端代码(server.c):

#include 
#include 
#include
#include 
#include
#include 
#include 

#define PORT 8080
#define BUFFER_SIZE 1024

int main() {
    int server_fd, client_fd;
    struct sockaddr_in server_addr, client_addr;
    socklen_t client_addr_size;
    char buffer[BUFFER_SIZE];
    FILE *file;

    // 创建 socket
    server_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (server_fd == -1) {
        perror("socket");
        exit(1);
    }

    // 配置服务器地址
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    server_addr.sin_port = htons(PORT);

    // 绑定 socket
    if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
        perror("bind");
        exit(1);
    }

    // 监听连接
    if (listen(server_fd, 1) == -1) {
        perror("listen");
        exit(1);
    }

    // 接受客户端连接
    client_addr_size = sizeof(client_addr);
    client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &client_addr_size);
    if (client_fd == -1) {
        perror("accept");
        exit(1);
    }

    // 打开文件
    file = fopen("file.txt", "rb");
    if (file == NULL) {
        perror("fopen");
        exit(1);
    }

    // 读取并发送文件内容
    while (!feof(file)) {
        size_t bytes_read = fread(buffer, 1, BUFFER_SIZE, file);
        send(client_fd, buffer, bytes_read, 0);
    }

    // 关闭文件和 socket
    fclose(file);
    close(client_fd);
    close(server_fd);

    return 0;
}

客户端代码(client.c):

#include 
#include 
#include
#include 
#include
#include 
#include 

#define SERVER_IP "127.0.0.1"
#define PORT 8080
#define BUFFER_SIZE 1024

int main() {
    int client_fd;
    struct sockaddr_in server_addr;
    char buffer[BUFFER_SIZE];
    FILE *file;

    // 创建 socket
    client_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (client_fd == -1) {
        perror("socket");
        exit(1);
    }

    // 配置服务器地址
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);
    server_addr.sin_port = htons(PORT);

    // 连接服务器
    if (connect(client_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
        perror("connect");
        exit(1);
    }

    // 打开文件
    file = fopen("received_file.txt", "wb");
    if (file == NULL) {
        perror("fopen");
        exit(1);
    }

    // 接收并写入文件内容
    while (1) {
        ssize_t bytes_received = recv(client_fd, buffer, BUFFER_SIZE, 0);
        if (bytes_received <= 0) {
            break;
        }
        fwrite(buffer, 1, bytes_received, file);
    }

    // 关闭文件和 socket
    fclose(file);
    close(client_fd);

    return 0;
}

要编译和运行这些示例代码,请按照以下步骤操作:

  1. 将上述代码分别保存为 server.cclient.c
  2. 使用 gcc 编译器分别编译这两个文件:gcc server.c -o servergcc client.c -o client
  3. 首先运行服务器端程序:./server
  4. 然后在另一个终端中运行客户端程序:./client
  5. 客户端程序将从服务器接收文件并将其保存为 received_file.txt

注意:这个示例代码仅用于演示目的,实际应用中可能需要考虑更多的错误处理和优化。

未经允许不得转载 » 本文链接:https://www.legongju.com/article/105091.html

相关推荐

  • hlist在Linux内核中的实现原理

    hlist在Linux内核中的实现原理

    hlist(Hash List)在Linux内核中是一种特殊的链表结构,它主要用于解决哈希冲突。当使用哈希表时,如果不同的键(key)产生了相同的哈希值,这些键就会被存储在...

  • bound在Linux文件系统权限控制中的应用

    bound在Linux文件系统权限控制中的应用

    在Linux文件系统权限控制中,“bound”实际上是一个错误的术语,可能是指“Bonding”技术。Bonding技术是一种网络配置,用于将多个物理网卡组合成一个逻辑网卡,...

  • 如何查看Linux系统的bound设置

    如何查看Linux系统的bound设置

    在 Linux 系统中,可以使用 ip 命令来查看网络接口的 bound 设置 打开终端(Terminal)。
    输入以下命令并按 Enter 键: ip addr show 这个命令将显示系统中...

  • Linux系统中bound的默认值是多少

    Linux系统中bound的默认值是多少

    在Linux系统中,bound的默认值取决于你所使用的程序或服务
    然而,在许多情况下,这些值可以通过配置文件或命令行参数进行调整。例如,在sshd服务中,MaxSta...

  • Linux socket编程与网络安全的关系是什么

    Linux socket编程与网络安全的关系是什么

    Linux socket编程与网络安全之间存在着紧密的关系,因为网络编程涉及到数据的传输和接收,这可能会受到各种安全威胁。以下是关于Linux socket编程与网络安全关系...

  • 在Linux中如何利用socket进行数据传输的监控

    在Linux中如何利用socket进行数据传输的监控

    在 Linux 中,可以使用 ss(socket statistics)命令来监控 socket 数据传输 安装 ss 命令:
    对于大多数 Linux 发行版,ss 命令已经预装。如果没有,可以通...

  • 如何使用Linux socket实现远程过程调用(RPC)

    如何使用Linux socket实现远程过程调用(RPC)

    在Linux中,使用socket实现远程过程调用(RPC)需要经过以下几个步骤: 定义通信协议:首先,你需要定义一个应用层的通信协议,用于在客户端和服务器之间传输数据...

  • 在Linux中如何进行socket性能优化

    在Linux中如何进行socket性能优化

    在 Linux 中,可以通过多种方法对 socket 进行性能优化 调整发送和接收缓冲区大小:
    使用 setsockopt() 函数可以设置 socket 的发送和接收缓冲区大小。例如...