用C语言写一个网络编程的程序,设定服务端的当前文件夹下有一个abc.txt文件。客户端与服务端连通后,客户端输入download abc.txt命令,服务端即把abc.txt文件传到客户端。注意,这只是一个例子,客户端可以输入任意文件名,服务端做出响应,把存在的文件发送到客户端,若文件不存在则发送提示
时间: 2024-03-17 11:40:41 浏览: 59
好的,这是一个基于TCP协议的简单文件传输示例。以下是服务端和客户端的代码实现:
服务端代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#define MAXLINE 1024
int main(int argc, char *argv[]) {
int listenfd, connfd;
struct sockaddr_in servaddr, cliaddr;
socklen_t len;
char buf[MAXLINE];
FILE *fp;
ssize_t n;
// 创建套接字
listenfd = socket(AF_INET, SOCK_STREAM, 0);
// 初始化服务器地址结构
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(9876);
// 绑定套接字和地址
bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
// 监听套接字
listen(listenfd, 5);
printf("Server is running at port 9876...\n");
while (1) {
// 接受客户端连接
len = sizeof(cliaddr);
connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &len);
printf("Client %s:%d connected.\n", inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));
// 读取客户端发来的命令
n = read(connfd, buf, MAXLINE);
if (n < 0) {
perror("read error");
exit(1);
}
buf[n] = '\0';
printf("Received command: %s", buf);
// 解析命令
if (strncmp(buf, "download ", 9) == 0) {
char *filename = buf + 9;
filename[strlen(filename) - 1] = '\0'; // 去掉末尾的换行符
// 打开文件
fp = fopen(filename, "rb");
if (fp == NULL) {
// 文件不存在
strcpy(buf, "File not found!\n");
write(connfd, buf, strlen(buf));
} else {
// 读取文件并发送给客户端
while ((n = fread(buf, 1, MAXLINE, fp)) > 0) {
write(connfd, buf, n);
}
fclose(fp);
}
} else {
// 不支持的命令
strcpy(buf, "Unsupported command!\n");
write(connfd, buf, strlen(buf));
}
// 关闭连接
close(connfd);
printf("Client %s:%d disconnected.\n", inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));
}
return 0;
}
```
客户端代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#define MAXLINE 1024
int main(int argc, char *argv[]) {
int sockfd;
struct sockaddr_in servaddr;
char buf[MAXLINE];
ssize_t n;
// 创建套接字
sockfd = socket(AF_INET, SOCK_STREAM, 0);
// 初始化服务器地址结构
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(9876);
inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr);
// 连接服务器
connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
// 获取用户输入的命令
printf("Enter command: ");
fgets(buf, MAXLINE, stdin);
// 发送命令到服务器
write(sockfd, buf, strlen(buf));
// 读取服务器的响应
while ((n = read(sockfd, buf, MAXLINE)) > 0) {
fwrite(buf, 1, n, stdout);
}
close(sockfd);
return 0;
}
```
运行示例:
首先编译并运行服务端程序:
```
$ gcc -o server server.c
$ ./server
```
然后再编译并运行客户端程序:
```
$ gcc -o client client.c
$ ./client
Enter command: download abc.txt
This is a test file.
```
客户端输入 `download abc.txt` 命令后,服务端会检查当前目录下是否存在 `abc.txt` 文件,如果存在就将其内容发送给客户端,否则发送 "File not found!" 提示。客户端接收到响应后将其输出到终端。
阅读全文