在Linux操作系统中,用C语言实现服务器与客户端之间图片的下载,并且在服务器或客户端的主函数实现,并使用线程
时间: 2024-04-09 14:28:23 浏览: 112
可以使用C语言的Socket编程来实现服务器与客户端之间的图片下载,并且可以利用线程来实现并发处理。以下是一个简单的示例代码:
服务器端(server.c):
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <pthread.h>
#define PORT 8080
#define MAX_CLIENTS 5
// 处理客户端请求的线程函数
void* handle_client(void* arg) {
int client_sock = *(int*)arg;
char buffer[1024] = {0};
FILE* file;
// 读取客户端发送的文件名
read(client_sock, buffer, 1024);
printf("Received request for file: %s\n", buffer);
// 打开文件
file = fopen(buffer, "rb");
if (file == NULL) {
printf("File not found\n");
close(client_sock);
pthread_exit(NULL);
}
// 逐块发送文件内容给客户端
while (1) {
unsigned char block[1024] = {0};
int bytesRead = fread(block, sizeof(unsigned char), 1024, file);
if (bytesRead > 0) {
write(client_sock, block, bytesRead);
}
if (bytesRead < 1024) {
if (feof(file)) {
printf("File sent successfully\n");
} else {
printf("Error reading file\n");
}
break;
}
}
fclose(file);
close(client_sock);
pthread_exit(NULL);
}
int main() {
int server_sock, client_sock;
struct sockaddr_in server_addr, client_addr;
socklen_t addr_len = sizeof(struct sockaddr_in);
pthread_t thread_id;
// 创建服务器套接字
server_sock = socket(AF_INET, SOCK_STREAM, 0);
if (server_sock == -1) {
printf("Socket creation failed\n");
return 1;
}
// 设置服务器地址和端口
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(PORT);
// 绑定服务器套接字到指定地址和端口
if (bind(server_sock, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
printf("Binding failed\n");
return 1;
}
// 监听客户端连接
if (listen(server_sock, MAX_CLIENTS) < 0) {
printf("Listening failed\n");
return 1;
}
printf("Server listening on port %d\n", PORT);
// 接受客户端连接并创建线程处理请求
while ((client_sock = accept(server_sock, (struct sockaddr*)&client_addr, &addr_len))) {
printf("New client connected\n");
if (pthread_create(&thread_id, NULL, handle_client, (void*)&client_sock) != 0) {
printf("Thread creation failed\n");
return 1;
}
pthread_detach(thread_id);
}
if (client_sock < 0) {
printf("Accept failed\n");
return 1;
}
close(server_sock);
return 0;
}
```
客户端(client.c):
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>
#define SERVER_IP "127.0.0.1"
#define PORT 8080
int main(int argc, char* argv[]) {
int client_sock;
struct sockaddr_in server_addr;
// 创建客户端套接字
client_sock = socket(AF_INET, SOCK_STREAM, 0);
if (client_sock == -1) {
printf("Socket creation failed\n");
return 1;
}
// 设置服务器地址和端口
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
if (inet_pton(AF_INET, SERVER_IP, &(server_addr.sin_addr)) <= 0) {
printf("Invalid address or address not supported\n");
return 1;
}
// 连接服务器
if (connect(client_sock, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
printf("Connection failed\n");
return 1;
}
// 发送文件名给服务器
char* filename = argv[1];
write(client_sock, filename, strlen(filename));
// 创建本地文件
FILE* file = fopen(filename, "wb");
if (file == NULL) {
printf("Error creating file\n");
return 1;
}
// 接收文件内容并写入本地文件
unsigned char block[1024] = {0};
int bytesRead;
while ((bytesRead = read(client_sock, block, sizeof(block))) > 0) {
fwrite(block, sizeof(unsigned char), bytesRead, file);
}
fclose(file);
close(client_sock);
return 0;
}
```
编译和运行示例代码:
1. 编译服务器端代码:`gcc server.c -o server -lpthread`
2. 编译客户端代码:`gcc client.c -o client`
3. 运行服务器端:`./server`
4. 在另一个终端窗口中运行客户端:`./client image.jpg`(将 image.jpg 替换为需要下载的图片文件名)
以上示例代码实现了一个简单的图片下载服务器和客户端。服务器通过监听端口接受客户端连接,并在接收到客户端请求后创建线程处理请求。客户端通过连接服务器并发送文件名,然后接收服务器发送的文件内容并保存为本地文件。
请注意,以上代码仅为示例,未对异常情况进行全面处理,实际使用中可能需要进行错误检查和处理。
阅读全文
相关推荐



















