在Linux系统中,用c语言编写一个客户端和服务器端程序,客户端连接到服务器端后,请求读取文档,然后显示结果。
时间: 2024-02-10 14:10:54 浏览: 87
好的,下面是一个简单的C语言代码示例,同样只读取本地的文件,可以根据自己的需求进行修改:
服务器端代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#define PORT 8888
int main(int argc, char const *argv[]) {
int server_fd, new_socket, valread;
struct sockaddr_in address;
int opt = 1;
int addrlen = sizeof(address);
char buffer[1024] = {0};
char *content = NULL;
// 创建一个TCP socket
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
// 设置socket选项
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
perror("setsockopt failed");
exit(EXIT_FAILURE);
}
// 绑定IP地址和端口号
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
// 开始监听客户端请求
if (listen(server_fd, 1) < 0) {
perror("listen failed");
exit(EXIT_FAILURE);
}
while (1) {
printf("等待客户端连接...\n");
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
perror("accept failed");
exit(EXIT_FAILURE);
}
printf("客户端连接成功!\n");
// 接收客户端请求
valread = read(new_socket, buffer, 1024);
printf("接收到请求:%s\n", buffer);
// 读取文档内容
FILE* file = fopen("test.txt", "r");
if (file) {
fseek(file, 0, SEEK_END);
long size = ftell(file);
fseek(file, 0, SEEK_SET);
content = malloc(size + 1);
if (content) {
fread(content, 1, size, file);
content[size] = '\0';
}
fclose(file);
}
// 发送文档内容给客户端
send(new_socket, content, strlen(content), 0);
// 关闭客户端连接
close(new_socket);
free(content);
content = NULL;
}
return 0;
}
```
客户端代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#define PORT 8888
int main(int argc, char const *argv[]) {
int sock = 0;
struct sockaddr_in serv_addr;
char buffer[1024] = {0};
char *content = NULL;
// 创建一个TCP socket
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
printf("\n Socket creation error \n");
return -1;
}
memset(&serv_addr, '0', sizeof(serv_addr));
// 设置服务器端的IP地址和端口号
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
// 将IP地址从字符串转换为网络字节序
if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr)<=0) {
printf("\nInvalid address/ Address not supported \n");
return -1;
}
// 连接服务器端的socket
if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
printf("\nConnection Failed \n");
return -1;
}
// 发送请求给服务器端
char request[] = "read_document";
send(sock, request, strlen(request), 0);
// 接收服务器端的响应
int valread = read(sock, buffer, 1024);
printf("%s\n", buffer);
// 关闭客户端连接
close(sock);
return 0;
}
```
注意事项:
1. 在实际项目中,需要考虑异常处理、多线程处理等问题。上述示例只是提供一个简单的思路。
2. 在服务器端的代码中,我们使用了动态内存分配,所以需要在发送数据之后释放内存,避免内存泄漏。
3. 在客户端的代码中,我们使用了inet_pton函数将IP地址从字符串转换为网络字节序,需要注意参数的顺序。
阅读全文