用c语言编写一个客户端和服务器端程序,客户端连接到服务器端后,给服务器发出读取一个文档的指令“read a.txt”,服务器读取a.txt,如果该文档存在,则返回结果并显示,如果该文件不存在,则返回“The file is not exist”。
时间: 2024-03-03 12:50:42 浏览: 49
c语言实现客户端与服务端的通信
5星 · 资源好评率100%
好的,我可以帮你回答这个问题。
首先,需要使用socket编程来实现客户端和服务器端的通信。以下是一个简单的实现:
服务端代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <fcntl.h>
#define MAXLINE 1024
int main(int argc, char *argv[])
{
int listenfd, connfd;
struct sockaddr_in servaddr, cliaddr;
socklen_t len;
char buff[MAXLINE];
char filename[20] = {0};
// 创建socket
listenfd = socket(AF_INET, SOCK_STREAM, 0);
if (listenfd == -1)
{
perror("create socket error");
exit(1);
}
// 设置socket地址重用
int on = 1;
if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0)
{
perror("setsockopt error");
exit(1);
}
// 绑定地址和端口号
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(9876);
if (bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1)
{
perror("bind error");
exit(1);
}
// 监听socket
if (listen(listenfd, 10) == -1)
{
perror("listen error");
exit(1);
}
printf("waiting for client...\n");
while (1)
{
// 接收客户端连接
len = sizeof(cliaddr);
connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &len);
if (connfd == -1)
{
perror("accept error");
continue;
}
printf("client %s:%d connected\n", inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));
// 接收客户端请求
memset(buff, 0, MAXLINE);
recv(connfd, buff, MAXLINE, 0);
sscanf(buff, "%*s %s", filename);
printf("client request file: %s\n", filename);
// 打开文件
int fd = open(filename, O_RDONLY);
if (fd == -1)
{
// 文件不存在
send(connfd, "The file is not exist", strlen("The file is not exist"), 0);
printf("The file is not exist\n");
}
else
{
// 文件存在
memset(buff, 0, MAXLINE);
int n = read(fd, buff, MAXLINE);
send(connfd, buff, n, 0);
printf("send file content to client\n");
close(fd);
}
// 关闭连接
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>
#define MAXLINE 1024
int main(int argc, char *argv[])
{
int sockfd;
struct sockaddr_in servaddr;
char buff[MAXLINE];
char filename[20] = {0};
// 创建socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1)
{
perror("create socket error");
exit(1);
}
// 设置服务器地址
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(9876);
if (inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr) == -1)
{
perror("inet_pton error");
exit(1);
}
// 连接服务器
if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1)
{
perror("connect error");
exit(1);
}
printf("connected to server\n");
// 发送请求
sprintf(filename, "a.txt");
sprintf(buff, "read %s", filename);
send(sockfd, buff, strlen(buff), 0);
// 接收响应
memset(buff, 0, MAXLINE);
int n = recv(sockfd, buff, MAXLINE, 0);
if (n == -1)
{
perror("recv error");
exit(1);
}
// 处理响应
if (strcmp(buff, "The file is not exist") == 0)
{
printf("The file is not exist\n");
}
else
{
printf("file content:\n%s\n", buff);
}
// 关闭连接
close(sockfd);
printf("disconnected from server\n");
return 0;
}
```
注意:以上代码只是一个简单的示例,没有考虑错误处理和安全性等方面的问题,实际使用时需要进行完善。
阅读全文