C语言编程题实现一个简易的文件传输工具

C语言编程题,实现一个简易的文件传输工具。C语言实现文件传输工具,本质上是通过网络套接字(Socket)编程,实现两个程序之间的数据传输。其中,一个程序作为服务器端,监听客户端的连接请求,另一个程序作为客户端,向服务器端发起连接请求并发送文件。

1、服务器端代码(server.c)

通过 socket() 创建服务器的套接字。通过 bind() 将套接字绑定到特定的 IP 和端口号。通过 listen() 开始监听客户端的连接请求。使用 accept() 接受客户端连接。通过 read() 接收客户端发送的数据,并使用 fwrite() 将数据保存到文件 received_file.txt 中。关闭文件和网络套接字。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

#define PORT 8080
#define BUFFER_SIZE 1024

int main() {
    int server_fd, new_socket;
    struct sockaddr_in address;
    int addrlen = sizeof(address);
    char buffer[BUFFER_SIZE] = {0};

    // 创建套接字
    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
        perror("socket failed");
        exit(EXIT_FAILURE);
    }

    // 绑定服务器 IP 和端口
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(PORT);

    if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
        perror("bind failed");
        exit(EXIT_FAILURE);
    }

    // 监听连接请求
    if (listen(server_fd, 3) < 0) {
        perror("listen");
        exit(EXIT_FAILURE);
    }
    printf("服务器正在端口 %d 上监听...\n", PORT);

    // 接受客户端连接
    if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
        perror("accept");
        exit(EXIT_FAILURE);
    }
    printf("客户端已连接...\n");

    // 创建或打开文件,用于存储接收到的数据
    FILE *file = fopen("received_file.txt", "wb");
    if (file == NULL) {
        perror("文件打开失败");
        exit(EXIT_FAILURE);
    }

    // 从客户端接收数据并写入文件
    int bytes_read;
    while ((bytes_read = read(new_socket, buffer, BUFFER_SIZE)) > 0) {
        fwrite(buffer, sizeof(char), bytes_read, file);
    }

    printf("文件接收完毕,已保存为 received_file.txt\n");

    // 关闭文件和套接字
    fclose(file);
    close(new_socket);
    close(server_fd);

    return 0;
}

2、客户端代码(client.c)

通过 socket() 创建客户端的套接字。通过 inet_pton() 将服务器 IP 地址转换为二进制格式,并设置服务器的端口。使用 connect() 连接到服务器。打开本地文件 send_file.txt,使用 fread() 读取文件数据,并通过 send() 发送给服务器。关闭文件和网络套接字。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

#define PORT 8080
#define BUFFER_SIZE 1024

int main() {
    int sock = 0;
    struct sockaddr_in serv_addr;
    char buffer[BUFFER_SIZE] = {0};

    // 创建套接字
    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        printf("套接字创建失败\n");
        return -1;
    }

    // 设置服务器地址和端口
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(PORT);

    // 转换服务器 IP 地址
    if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {
        printf("无效地址\n");
        return -1;
    }

    // 连接服务器
    if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
        printf("连接失败\n");
        return -1;
    }
    printf("已连接到服务器...\n");

    // 打开要发送的文件
    FILE *file = fopen("send_file.txt", "rb");
    if (file == NULL) {
        perror("文件打开失败");
        return -1;
    }

    // 读取文件并通过套接字发送
    int bytes_read;
    while ((bytes_read = fread(buffer, sizeof(char), BUFFER_SIZE, file)) > 0) {
        send(sock, buffer, bytes_read, 0);
    }

    printf("文件发送完毕\n");

    // 关闭文件和套接字
    fclose(file);
    close(sock);

    return 0;
}

3、编译与运行

在 Linux 或 macOS 系统上,可以通过 GCC 编译并运行客户端和服务器程序。

1)编译服务器端程序

gcc server.c -o server

2)编译客户端程序

gcc client.c -o client

3)运行服务器

先启动服务器,让其等待客户端的连接。

./server

4)运行客户端

再启动客户端,将文件 send_file.txt 发送给服务器。

./client

推荐阅读
cjavapy编程之路首页