【无标题】

  1. 服务器端(设备 B)
    服务器端(B)会等待来自设备 A 的连接,然后接收文件并保存。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

#define PORT 8080
#define BUFFER_SIZE 1024

void save_file(int client_socket) {
    char buffer[BUFFER_SIZE];
    int bytes_received;
    FILE *file;

    // 接收文件名
    bytes_received = recv(client_socket, buffer, BUFFER_SIZE, 0);
    if (bytes_received <= 0) {
        printf("Error receiving filename.\n");
        return;
    }
    buffer[bytes_received] = '\0';
    printf("Receiving file: %s\n", buffer);
    file = fopen(buffer, "wb");
    if (file == NULL) {
        printf("Error opening file for writing.\n");
        return;
    }

    // 接收文件数据并写入文件
    while ((bytes_received = recv(client_socket, buffer, BUFFER_SIZE, 0)) > 0) {
        fwrite(buffer, sizeof(char), bytes_received, file);
    }
    if (bytes_received < 0) {
        printf("Error receiving data.\n");
    }
    printf("File received successfully.\n");

    fclose(file);
}

int main() {
    int server_socket, client_socket;
    struct sockaddr_in server_addr, client_addr;
    socklen_t client_addr_len = sizeof(client_addr);

    // 创建服务器 socket
    server_socket = socket(AF_INET, SOCK_STREAM, 0);
    if (server_socket == -1) {
        perror("Socket creation failed");
        return -1;
    }

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

    // 绑定 socket 到地址
    if (bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
        perror("Bind failed");
        close(server_socket);
        return -1;
    }

    // 监听连接请求
    if (listen(server_socket, 3) < 0) {
        perror("Listen failed");
        close(server_socket);
        return -1;
    }

    printf("Server listening on port %d...\n", PORT);

    // 接受客户端连接
    client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &client_addr_len);
    if (client_socket < 0) {
        perror("Accept failed");
        close(server_socket);
        return -1;
    }

    printf("Client connected. Receiving file...\n");

    // 保存接收到的文件
    save_file(client_socket);

    close(client_socket);
    close(server_socket);
    return 0;
}

  1. 客户端(设备 A)
    客户端(A)负责监控文件夹,检测文件的变化,并将文件传送到设备 B。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <dirent.h>
#include <sys/stat.h>

#define PORT 8080
#define BUFFER_SIZE 1024

void send_file(int socket, const char *file_path) {
    FILE *file = fopen(file_path, "rb");
    char buffer[BUFFER_SIZE];
    int bytes_read;

    if (file == NULL) {
        perror("Error opening file");
        return;
    }

    // 发送文件名
    send(socket, file_path, strlen(file_path), 0);

    // 发送文件内容
    while ((bytes_read = fread(buffer, sizeof(char), BUFFER_SIZE, file)) > 0) {
        send(socket, buffer, bytes_read, 0);
    }

    printf("File %s sent successfully.\n", file_path);
    fclose(file);
}

void monitor_directory(const char *directory, int socket) {
    struct dirent *entry;
    DIR *dp = opendir(directory);

    if (dp == NULL) {
        perror("Error opening directory");
        return;
    }

    while ((entry = readdir(dp)) != NULL) {
        // 排除 "." 和 ".."
        if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {
            continue;
        }

        char file_path[BUFFER_SIZE];
        snprintf(file_path, sizeof(file_path), "%s/%s", directory, entry->d_name);

        // 只处理文件,不处理目录
        struct stat st;
        stat(file_path, &st);
        if (S_ISREG(st.st_mode)) {
            // 发送文件到服务器
            send_file(socket, file_path);
        }
    }

    closedir(dp);
}

int main() {
    int client_socket;
    struct sockaddr_in server_addr;
    const char *directory_to_monitor = "/path/to/your/folder";  // 替换为你的文件夹路径

    // 创建客户端 socket
    client_socket = socket(AF_INET, SOCK_STREAM, 0);
    if (client_socket == -1) {
        perror("Socket creation failed");
        return -1;
    }

    // 配置服务器地址
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(PORT);
    server_addr.sin_addr.s_addr = inet_addr("192.168.x.x");  // 替换为设备 B 的 IP 地址

    // 连接到服务器
    if (connect(client_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
        perror("Connection failed");
        close(client_socket);
        return -1;
    }

    printf("Connected to server. Monitoring folder...\n");

    // 监控文件夹并传输文件
    while (1) {
        monitor_directory(directory_to_monitor, client_socket);
        sleep(5);  // 每隔 5 秒检查一次文件夹
    }

    close(client_socket);
    return 0;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值