- 服务器端(设备 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;
}
- 客户端(设备 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;
}