c语言 服务器传一个地址给客户端 客户端下载文件到指定目录下
时间: 2024-02-13 12:01:00 浏览: 73
在C语言中,实现服务器向客户端传递文件可以采用以下步骤:
1. 服务器端打开指定的文件,并读取文件内容到缓存区中。
2. 服务器端将缓存区中的文件内容发送给客户端。
3. 客户端接收到文件内容后,将文件内容写入到指定的本地文件中。
下面是一个简单的示例代码,可以实现服务器向客户端传递文件并保存到指定的本地目录中:
服务器端代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <fcntl.h>
#define PORT 8888
#define BUFFER_SIZE 1024
int main(int argc, char *argv[])
{
int server_fd, client_fd;
struct sockaddr_in server_addr, client_addr;
socklen_t client_addr_len = sizeof(client_addr);
char buffer[BUFFER_SIZE];
// 创建服务器端socket
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket create failed");
exit(1);
}
// 设置服务器端口号和IP地址
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");
// 绑定服务器端口号和IP地址
if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1)
{
perror("bind failed");
exit(1);
}
// 开始监听客户端的连接请求
if (listen(server_fd, 5) == -1)
{
perror("listen failed");
exit(1);
}
printf("Waiting for client to connect...\n");
// 接受客户端连接请求
if ((client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &client_addr_len)) == -1)
{
perror("accept failed");
exit(1);
}
printf("Client connected: %s:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
// 打开文件
int file_fd = open("test.txt", O_RDONLY);
if (file_fd == -1)
{
perror("open file failed");
exit(1);
}
// 读取文件内容到缓存区中并发送给客户端
ssize_t count;
while ((count = read(file_fd, buffer, BUFFER_SIZE)) > 0)
{
if (write(client_fd, buffer, count) == -1)
{
perror("send file failed");
exit(1);
}
}
printf("File sent successfully\n");
// 关闭文件和socket
close(file_fd);
close(client_fd);
close(server_fd);
return 0;
}
```
客户端代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <fcntl.h>
#define PORT 8888
#define BUFFER_SIZE 1024
int main(int argc, char *argv[])
{
int client_fd;
struct sockaddr_in server_addr;
char buffer[BUFFER_SIZE];
// 创建客户端socket
if ((client_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket create failed");
exit(1);
}
// 设置服务器端口号和IP地址
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(client_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1)
{
perror("connect failed");
exit(1);
}
printf("Connected to server\n");
// 打开本地文件
int file_fd = open("test.txt", O_WRONLY | O_CREAT, 0644);
if (file_fd == -1)
{
perror("open file failed");
exit(1);
}
// 从服务器接收文件内容并写入到本地文件中
ssize_t count;
while ((count = read(client_fd, buffer, BUFFER_SIZE)) > 0)
{
if (write(file_fd, buffer, count) == -1)
{
perror("write file failed");
exit(1);
}
}
printf("File received and saved successfully\n");
// 关闭文件和socket
close(file_fd);
close(client_fd);
return 0;
}
```
在上述代码中,服务器端打开了名为“test.txt”的文件,并将文件内容发送给客户端。客户端接收到文件内容后,将文件内容写入到名为“test.txt”的本地文件中。你只需要将文件名替换成你要传递的文件名,并将服务器端的IP地址和端口号设置为正确的值即可。
阅读全文