用C语言写一段http服务器和客户端
时间: 2023-12-14 12:37:10 浏览: 30
以下是一个简单的使用C语言编写的HTTP服务器和客户端的示例代码。
HTTP服务器:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#define MAX_MSG_SIZE 1024
void handle_request(int client_socket) {
char message[MAX_MSG_SIZE];
ssize_t bytes_received = recv(client_socket, message, MAX_MSG_SIZE, 0);
if (bytes_received < 0) {
perror("Unable to receive request");
return;
}
printf("Received request: %s\n", message);
char response[] = "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nContent-Length: 12\r\n\r\nHello World!";
ssize_t bytes_sent = send(client_socket, response, strlen(response), 0);
if (bytes_sent < 0) {
perror("Unable to send response");
return;
}
printf("Sent response: %s\n", response);
}
int main(int argc, char *argv[]) {
int server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (server_socket < 0) {
perror("Unable to create server socket");
exit(EXIT_FAILURE);
}
struct sockaddr_in server_address;
memset(&server_address, 0, sizeof(server_address));
server_address.sin_family = AF_INET;
server_address.sin_port = htons(8000);
server_address.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(server_socket, (struct sockaddr *)&server_address, sizeof(server_address)) < 0) {
perror("Unable to bind server socket");
exit(EXIT_FAILURE);
}
if (listen(server_socket, 10) < 0) {
perror("Unable to listen to server socket");
exit(EXIT_FAILURE);
}
printf("Server listening on port 8000...\n");
while (1) {
struct sockaddr_in client_address;
socklen_t client_address_length = sizeof(client_address);
int client_socket = accept(server_socket, (struct sockaddr *)&client_address, &client_address_length);
if (client_socket < 0) {
perror("Unable to accept client connection");
continue;
}
printf("Accepted client connection from %s:%d\n", inet_ntoa(client_address.sin_addr), ntohs(client_address.sin_port));
handle_request(client_socket);
close(client_socket);
printf("Closed client connection\n");
}
close(server_socket);
printf("Closed server socket\n");
return 0;
}
```
HTTP客户端:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#define MAX_MSG_SIZE 1024
int main(int argc, char *argv[]) {
int client_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (client_socket < 0) {
perror("Unable to create client socket");
exit(EXIT_FAILURE);
}
struct sockaddr_in server_address;
memset(&server_address, 0, sizeof(server_address));
server_address.sin_family = AF_INET;
server_address.sin_port = htons(8000);
if (inet_pton(AF_INET, "127.0.0.1", &server_address.sin_addr) <= 0) {
perror("Unable to convert server address");
exit(EXIT_FAILURE);
}
if (connect(client_socket, (struct sockaddr *)&server_address, sizeof(server_address)) < 0) {
perror("Unable to connect to server");
exit(EXIT_FAILURE);
}
char request[] = "GET / HTTP/1.1\r\nHost: localhost\r\n\r\n";
ssize_t bytes_sent = send(client_socket, request, strlen(request), 0);
if (bytes_sent < 0) {
perror("Unable to send request");
exit(EXIT_FAILURE);
}
printf("Sent request: %s\n", request);
char response[MAX_MSG_SIZE];
ssize_t bytes_received = recv(client_socket, response, MAX_MSG_SIZE, 0);
if (bytes_received < 0) {
perror("Unable to receive response");
exit(EXIT_FAILURE);
}
printf("Received response: %.*s\n", (int)bytes_received, response);
close(client_socket);
printf("Closed client socket\n");
return 0;
}
```
注意:这只是一个简单的示例,不具备完整的HTTP协议支持。在实际应用中,需要仔细考虑各种HTTP请求和响应可能遇到的情况并进行相应的处理。