c语言:编写一个客户端和服务器端程序,客户端连接到服务器端后,请求一个文档,然后显示结果。
时间: 2024-02-11 13:06:22 浏览: 115
ssl.zip_c ssl_c语言 openssl_linux openssl_site:www.pudn.com
好的,这是一个基于 Socket 的 C/S 模型的程序,下面分别给出客户端和服务器端的代码。
服务器端代码(server.c):
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define PORT 8080
#define MAXLINE 1024
int main() {
int sockfd, newfd;
struct sockaddr_in servaddr, cliaddr;
char buffer[MAXLINE];
char *response = "Hello, World!\n";
// 创建 socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("socket creation failed");
exit(EXIT_FAILURE);
}
// 初始化服务器地址
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = INADDR_ANY;
servaddr.sin_port = htons(PORT);
// 绑定地址和端口
if (bind(sockfd, (const struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
// 监听连接
if (listen(sockfd, 5) < 0) {
perror("listen failed");
exit(EXIT_FAILURE);
}
printf("Server listening on port %d...\n", PORT);
while (1) {
socklen_t len = sizeof(cliaddr);
// 接受连接请求
newfd = accept(sockfd, (struct sockaddr *)&cliaddr, &len);
if (newfd < 0) {
perror("accept failed");
exit(EXIT_FAILURE);
}
printf("Accepted new connection from %s:%d\n", inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));
// 接收客户端请求
if (recv(newfd, buffer, MAXLINE, 0) < 0) {
perror("recv failed");
exit(EXIT_FAILURE);
}
printf("Received request: %s", buffer);
// 发送响应
if (send(newfd, response, strlen(response), 0) < 0) {
perror("send failed");
exit(EXIT_FAILURE);
}
printf("Sent response: %s", response);
// 关闭连接
close(newfd);
}
return 0;
}
```
客户端代码(client.c):
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define PORT 8080
#define MAXLINE 1024
int main() {
int sockfd;
struct sockaddr_in servaddr;
char buffer[MAXLINE];
// 创建 socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("socket creation failed");
exit(EXIT_FAILURE);
}
// 初始化服务器地址
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
servaddr.sin_port = htons(PORT);
// 连接服务器
if (connect(sockfd, (const struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
perror("connection failed");
exit(EXIT_FAILURE);
}
printf("Connected to server on port %d\n", PORT);
// 发送请求
char *request = "GET / HTTP/1.1\r\nHost: localhost\r\n\r\n";
if (send(sockfd, request, strlen(request), 0) < 0) {
perror("send failed");
exit(EXIT_FAILURE);
}
printf("Sent request: %s", request);
// 接收响应
if (recv(sockfd, buffer, MAXLINE, 0) < 0) {
perror("recv failed");
exit(EXIT_FAILURE);
}
printf("Received response: %s", buffer);
// 关闭连接
close(sockfd);
return 0;
}
```
这个程序的核心是 `socket`、`bind`、`listen`、`accept`、`connect`、`send` 和 `recv` 函数。其中,服务器端程序需要依次进行 `socket`、`bind`、`listen`、`accept`、`recv` 和 `send` 操作,而客户端程序需要依次进行 `socket`、`connect`、`send` 和 `recv` 操作。在这个程序中,服务器只是简单地响应一个固定的字符串,实际中应该根据请求来返回不同的响应。
阅读全文