你能帮我写一个linux局域网文件下载与处理程序么,要求使用C语言,使用客户/服务器模式
时间: 2024-02-05 11:05:22 浏览: 31
当然可以。这里给您提供一个基于C语言、使用客户/服务器模式的局域网文件下载与处理程序的示例代码。您可以根据自己的需求进行修改和优化。
服务器端代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#define PORT 8888
#define MAX_BUFFER_SIZE 1024
// 处理文件
void process_file(const char *src_path, const char *dest_path) {
// TODO: 根据需要进行文件处理
// 这里只是将源文件复制到目标路径
char command[MAX_BUFFER_SIZE];
snprintf(command, MAX_BUFFER_SIZE, "cp %s %s", src_path, dest_path);
system(command);
}
// 服务器处理客户端请求
void handle_client_request(int client_socket) {
char buffer[MAX_BUFFER_SIZE];
ssize_t recv_size;
ssize_t send_size;
char file_path[MAX_BUFFER_SIZE];
char dest_path[MAX_BUFFER_SIZE];
FILE *file;
// 接收文件路径
recv_size = recv(client_socket, buffer, MAX_BUFFER_SIZE, 0);
if (recv_size <= 0) {
fprintf(stderr, "Error: Failed to receive file path\n");
return;
}
buffer[recv_size] = '\0';
sscanf(buffer, "%s", file_path);
// 打开文件
file = fopen(file_path, "rb");
if (file == NULL) {
fprintf(stderr, "Error: Failed to open file: %s\n", file_path);
return;
}
// 发送文件数据
while ((recv_size = fread(buffer, 1, MAX_BUFFER_SIZE, file)) > 0) {
send_size = send(client_socket, buffer, recv_size, 0);
if (send_size != recv_size) {
fprintf(stderr, "Error: Failed to send file data\n");
break;
}
}
// 关闭文件
fclose(file);
// 接收目标路径
recv_size = recv(client_socket, buffer, MAX_BUFFER_SIZE, 0);
if (recv_size <= 0) {
fprintf(stderr, "Error: Failed to receive dest path\n");
return;
}
buffer[recv_size] = '\0';
sscanf(buffer, "%s", dest_path);
// 处理文件
process_file(file_path, dest_path);
// 发送处理后的文件数据
file = fopen(dest_path, "rb");
if (file == NULL) {
fprintf(stderr, "Error: Failed to open file: %s\n", dest_path);
return;
}
while ((recv_size = fread(buffer, 1, MAX_BUFFER_SIZE, file)) > 0) {
send_size = send(client_socket, buffer, recv_size, 0);
if (send_size != recv_size) {
fprintf(stderr, "Error: Failed to send processed file data\n");
break;
}
}
// 关闭文件
fclose(file);
}
int main() {
int server_socket;
int client_socket;
struct sockaddr_in server_address;
struct sockaddr_in client_address;
socklen_t client_address_size;
int opt = 1;
// 创建服务器套接字
server_socket = socket(AF_INET, SOCK_STREAM, 0);
if (server_socket < 0) {
fprintf(stderr, "Error: Failed to create server socket\n");
exit(EXIT_FAILURE);
}
// 设置服务器套接字选项
if (setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) {
fprintf(stderr, "Error: Failed to set server socket options\n");
exit(EXIT_FAILURE);
}
// 绑定服务器套接字地址
memset(&server_address, 0, sizeof(server_address));
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = INADDR_ANY;
server_address.sin_port = htons(PORT);
if (bind(server_socket, (struct sockaddr *)&server_address, sizeof(server_address)) < 0) {
fprintf(stderr, "Error: Failed to bind server socket\n");
exit(EXIT_FAILURE);
}
// 监听客户端连接
if (listen(server_socket, SOMAXCONN) < 0) {
fprintf(stderr, "Error: Failed to listen on server socket\n");
exit(EXIT_FAILURE);
}
printf("Server is running on port %d...\n", PORT);
// 接收客户端连接请求并处理
while (1) {
client_address_size = sizeof(client_address);
client_socket = accept(server_socket, (struct sockaddr *)&client_address, &client_address_size);
if (client_socket < 0) {
fprintf(stderr, "Error: Failed to accept client connection\n");
continue;
}
handle_client_request(client_socket);
close(client_socket);
}
close(server_socket);
return 0;
}
```
客户端代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#define SERVER_ADDRESS "127.0.0.1"
#define PORT 8888
#define MAX_BUFFER_SIZE 1024
// 下载文件
void download_file(const char *url, const char *dest_path) {
FILE *file;
char command[MAX_BUFFER_SIZE];
snprintf(command, MAX_BUFFER_SIZE, "wget -O %s %s", dest_path, url);
system(command);
}
int main() {
int client_socket;
struct sockaddr_in server_address;
char buffer[MAX_BUFFER_SIZE];
ssize_t recv_size;
ssize_t send_size;
char file_path[MAX_BUFFER_SIZE];
char dest_path[MAX_BUFFER_SIZE];
FILE *file;
// 创建客户端套接字
client_socket = socket(AF_INET, SOCK_STREAM, 0);
if (client_socket < 0) {
fprintf(stderr, "Error: Failed to create client socket\n");
exit(EXIT_FAILURE);
}
// 设置服务器地址
memset(&server_address, 0, sizeof(server_address));
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = inet_addr(SERVER_ADDRESS);
server_address.sin_port = htons(PORT);
// 连接服务器
if (connect(client_socket, (struct sockaddr *)&server_address, sizeof(server_address)) < 0) {
fprintf(stderr, "Error: Failed to connect to server\n");
exit(EXIT_FAILURE);
}
// 下载文件
download_file("http://example.com/file.txt", "/tmp/file.txt");
// 发送文件路径
snprintf(buffer, MAX_BUFFER_SIZE, "%s", "/tmp/file.txt");
send_size = send(client_socket, buffer, strlen(buffer), 0);
if (send_size <= 0) {
fprintf(stderr, "Error: Failed to send file path\n");
exit(EXIT_FAILURE);
}
// 接收文件数据并保存
file = fopen("/tmp/received_file.txt", "wb");
if (file == NULL) {
fprintf(stderr, "Error: Failed to open file for writing\n");
exit(EXIT_FAILURE);
}
while ((recv_size = recv(client_socket, buffer, MAX_BUFFER_SIZE, 0)) > 0) {
fwrite(buffer, 1, recv_size, file);
}
// 关闭文件
fclose(file);
// 发送目标路径
snprintf(buffer, MAX_BUFFER_SIZE, "%s", "/tmp/processed_file.txt");
send_size = send(client_socket, buffer, strlen(buffer), 0);
if (send_size <= 0) {
fprintf(stderr, "Error: Failed to send dest path\n");
exit(EXIT_FAILURE);
}
// 接收处理后的文件数据并保存
file = fopen("/tmp/processed_file.txt", "wb");
if (file == NULL) {
fprintf(stderr, "Error: Failed to open file for writing\n");
exit(EXIT_FAILURE);
}
while ((recv_size = recv(client_socket, buffer, MAX_BUFFER_SIZE, 0)) > 0) {
fwrite(buffer, 1, recv_size, file);
}
// 关闭文件
fclose(file);
close(client_socket);
return 0;
}
```
这个程序使用了客户/服务器模式,客户端将文件下载到本地并发送文件路径到服务器,服务器接收到请求后发送文件数据给客户端,并处理文件,然后将处理后的文件数据发送给客户端。您可以根据自己的需求修改文件下载地址、保存路径以及文件处理函数等。