你能在Linux环境下完成C语言程序么,功能需求: (1)程序分为服务器端和客户端,分别完成文件的分发和文件的下载请求。 (2)服务器端:等待用户输入相应端口并创建好相应的套接字之后,进入循环监听,如果有客户端请求下载文件则响应请求并传输文件;如果没有请求则一直监听,直到收到终止信号,终止服务器端程序。 (3)客户端:等待用户输入服务器端IP地址和端口,然后建立连接,如果连接请求得到回应,则等待用户输入文件名,并根据用户输入的文件名完成文件传输。
时间: 2024-02-13 16:07:14 浏览: 81
linux系统下C语言编写的服务端和客户端,客户端发送相应的指令,对服务端的数据库,进行增删改查等功能,编译运行通过
是的,我可以在Linux环境下完成这个C语言程序。以下是实现该程序的步骤和代码示例:
步骤一:定义服务器端和客户端的套接字,以及相应的数据结构。
```c
// 服务器端套接字
int server_sockfd;
// 客户端套接字
int client_sockfd;
// 服务器端和客户端地址结构体
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
// 文件传输的缓冲区
char buffer[BUFFER_SIZE];
```
步骤二:创建服务器端套接字,并设置套接字选项。
```c
// 创建服务器端套接字
server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (server_sockfd == -1) {
perror("Create server socket failed");
exit(EXIT_FAILURE);
}
// 设置套接字选项,允许端口重用
int optval = 1;
if (setsockopt(server_sockfd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) == -1) {
perror("Set socket option failed");
exit(EXIT_FAILURE);
}
```
步骤三:绑定服务器端地址结构体,并开始监听请求。
```c
// 绑定服务器端地址结构体
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(port);
if (bind(server_sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
perror("Bind server address failed");
exit(EXIT_FAILURE);
}
// 开始监听请求
if (listen(server_sockfd, BACKLOG) == -1) {
perror("Listen failed");
exit(EXIT_FAILURE);
}
```
步骤四:等待客户端连接,并响应下载请求。
```c
// 等待客户端连接
socklen_t client_addrlen = sizeof(client_addr);
client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_addr, &client_addrlen);
if (client_sockfd == -1) {
perror("Accept failed");
exit(EXIT_FAILURE);
}
// 接收客户端传来的文件名
char filename[FILENAME_MAX];
recv(client_sockfd, filename, FILENAME_MAX, 0);
// 打开文件并发送数据
FILE *fp = fopen(filename, "rb");
if (fp == NULL) {
perror("Open file failed");
exit(EXIT_FAILURE);
}
while (1) {
int file_block = fread(buffer, sizeof(char), BUFFER_SIZE, fp);
if (file_block == 0) {
break;
}
if (send(client_sockfd, buffer, file_block, 0) == -1) {
perror("Send file failed");
exit(EXIT_FAILURE);
}
}
fclose(fp);
```
步骤五:创建客户端套接字,并连接服务器端。
```c
// 创建客户端套接字
client_sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (client_sockfd == -1) {
perror("Create client socket failed");
exit(EXIT_FAILURE);
}
// 连接服务器端
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(server_ip);
server_addr.sin_port = htons(port);
if (connect(client_sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
perror("Connect failed");
exit(EXIT_FAILURE);
}
```
步骤六:发送下载请求,并接收服务器端传来的文件数据。
```c
// 发送下载请求
char filename[FILENAME_MAX];
printf("Please enter the filename you want to download: ");
scanf("%s", filename);
send(client_sockfd, filename, strlen(filename), 0);
// 接收文件数据并保存到本地文件
FILE *fp = fopen(filename, "wb");
if (fp == NULL) {
perror("Create file failed");
exit(EXIT_FAILURE);
}
while (1) {
int recv_block = recv(client_sockfd, buffer, BUFFER_SIZE, 0);
if (recv_block == 0) {
break;
}
fwrite(buffer, sizeof(char), recv_block, fp);
}
fclose(fp);
```
完整代码如下:
阅读全文