用C语言实现FTP文件传输(内容包括客户端上传文件给服务端,服务端接收文件并将文件保存在指定的路径。服务端上传文件给客户端,客户端接收文件并将文件保存在指定的路径。客户端列出指定路径下服务端的所有文件)在一台电脑上用Linux开多个终端实现
时间: 2024-04-16 22:28:06 浏览: 259
以下是一个简单的示例,展示如何在C语言中实现FTP文件传输的功能。这个示例使用了Linux系统提供的socket编程接口来进行网络通信,同时使用了标准C库函数来进行文件操作。在一台电脑上打开多个终端,其中一个终端作为服务端,其他终端作为客户端。
服务端代码(server.c):
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#define PORT 8080
#define MAX_BUFFER_SIZE 1024
int main() {
int sockfd, newsockfd;
struct sockaddr_in server_addr, client_addr;
socklen_t client_len;
char buffer[MAX_BUFFER_SIZE];
// 创建socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("Error in socket");
exit(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 = INADDR_ANY;
// 绑定socket
if (bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
perror("Error in binding");
exit(1);
}
// 监听连接
if (listen(sockfd, 5) < 0) {
perror("Error in listening");
exit(1);
}
printf("Server listening on port %d\n", PORT);
client_len = sizeof(client_addr);
// 接受客户端连接
newsockfd = accept(sockfd, (struct sockaddr*)&client_addr, &client_len);
if (newsockfd < 0) {
perror("Error in accepting connection");
exit(1);
}
// 接收文件名
memset(buffer, 0, sizeof(buffer));
if (recv(newsockfd, buffer, sizeof(buffer), 0) < 0) {
perror("Error in receiving filename");
exit(1);
}
// 打开文件
FILE* fp = fopen(buffer, "wb");
if (fp == NULL) {
perror("Error in opening file");
exit(1);
}
// 接收文件内容并保存到文件中
memset(buffer, 0, sizeof(buffer));
int n;
while ((n = recv(newsockfd, buffer, sizeof(buffer), 0)) > 0) {
fwrite(buffer, 1, n, fp);
memset(buffer, 0, sizeof(buffer));
}
if (n < 0) {
perror("Error in receiving file");
exit(1);
}
printf("File received successfully\n");
// 关闭文件和socket
fclose(fp);
close(newsockfd);
close(sockfd);
return 0;
}
```
客户端代码(client.c):
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define PORT 8080
#define MAX_BUFFER_SIZE 1024
int main() {
int sockfd;
struct sockaddr_in server_addr;
char buffer[MAX_BUFFER_SIZE];
char filename[MAX_BUFFER_SIZE];
// 创建socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("Error in socket");
exit(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("127.0.0.1");
// 连接服务器
if (connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
perror("Error in connecting to server");
exit(1);
}
// 输入要上传的文件名
printf("Enter the filename: ");
fgets(filename, sizeof(filename), stdin);
filename[strcspn(filename, "\n")] = 0;
// 发送文件名
if (send(sockfd, filename, strlen(filename), 0) < 0) {
perror("Error in sending filename");
exit(1);
}
// 打开文件
FILE* fp = fopen(filename, "rb");
if (fp == NULL) {
perror("Error in opening file");
exit(1);
}
// 读取文件内容并发送到服务器
int n;
while ((n = fread(buffer, 1, sizeof(buffer), fp)) > 0) {
if (send(sockfd, buffer, n, 0) < 0) {
perror("Error in sending file");
exit(1);
}
memset(buffer, 0, sizeof(buffer));
}
if (n < 0) {
perror("Error in reading file");
exit(1);
}
printf("File uploaded successfully\n");
// 关闭文件和socket
fclose(fp);
close(sockfd);
return 0;
}
```
编译和运行:
1. 在一个终端中,编译并运行服务端代码:
```
$ gcc server.c -o server
$ ./server
```
2. 在另一个终端中,编译并运行客户端代码:
```
$ gcc client.c -o client
$ ./client
```
客户端会提示你输入要上传的文件名,输入完毕后,文件将被传输到服务端并保存在指定的路径中。你可以在服务端的终端中看到文件传输的过程和状态。
要列出指定路径下服务端的所有文件,你可以在服务端代码中添加一个命令来实现。例如,你可以在接收文件名后,使用`opendir`和`readdir`函数来遍历指定路径下的所有文件,并将文件名发送给客户端。然后,在客户端代码中接收并打印这些文件名。
阅读全文