当前位置: 首页 > news >正文

WebServer

一、服务器代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <unistd.h>
#define PORT 80
#define BUFFER_SIZE 1024
void handle_request(int client_socket) {char buffer[BUFFER_SIZE];char response[] = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<html><body><h1>Hello, World!</h1></body></html>";// 从客户端读取请求ssize_t bytes_read = read(client_socket, buffer, BUFFER_SIZE - 1);if (bytes_read == -1) {perror("读取请求失败");return;}buffer[bytes_read] = '\0';// 打印请求内容printf("收到请求:\n%s\n", buffer);// 发送响应给客户端ssize_t bytes_written = write(client_socket, response, strlen(response));if (bytes_written == -1) {perror("发送响应失败");}}
int main() {int server_socket, client_socket;struct sockaddr_in server_address, client_address;socklen_t client_address_len;// 创建套接字if ((server_socket = socket(AF_INET, SOCK_STREAM, 0)) == -1) {perror("创建套接字失败");exit(1);}// 设置地址重用int reuse = 1;if (setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) == -1) {perror("设置地址重用失败");exit(1);// 绑定地址server_address.sin_family = AF_INET;server_address.sin_port = htons(PORT);server_address.sin_addr.s_addr = htonl(INADDR_ANY);if (bind(server_socket, (struct sockaddr *)&server_address, sizeof(server_address)) == -1) {perror("绑定地址失败");exit(1);}// 启动监听if (listen(server_socket, 10) == -1) {perror("启动监听失败");exit(1);}printf("服务器已启动,监听端口 %d\n", PORT);// 接受连接并处理请求while (1) {client_address_len = sizeof(client_address);if ((client_socket = accept(server_socket, (struct sockaddr *)&client_address, &client_address_len)) == -1) {perror("接受连接失败");continue;}printf("接受新连接\n");// 处理请求handle_request(client_socket);      // 关闭客户端套接字close(client_socket);printf("连接已关闭\n");}// 关闭服务器套接字close(server_socket);return 0;
}

二、代码思路

  1. 创建套接字:使用socket函数创建一个TCP套接字。
  2. 设置地址重用:通过setsockopt函数允许地址重用,以便在程序结束后迅速重启。
  3. 绑定地址:将套接字绑定到指定的IP地址和端口(这里是80)。
  4. 监听连接:调用listen函数使服务器开始监听传入的连接请求。
  5. 接受连接:在一个无限循环中,使用accept函数接受客户端连接。
  6. 处理请求:读取客户端请求并打印,然后发送一个简单的HTTP响应。
  7. 关闭连接:处理完请求后关闭客户端套接字,准备接受下一个连接。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 系统架构笔记-4-信息安全技术基础知识
  • Innodb内存结构
  • LeetCode讲解篇之1343. 大小为 K 且平均值大于等于阈值的子数组数目
  • C++门迷宫
  • 网络安全-shire写任务计划、反弹shell、写私钥、反序列化
  • TikTokDownloader 开源项目操作教程
  • Koa (下一代web框架) 【Node.js进阶】
  • Spring Mybatis 基本使用 总结
  • [数据集][目标检测]智慧养殖场肉鸡健康状态检测数据集VOC+YOLO格式4657张2类别
  • 基于centos7.9搭建SFTP服务
  • 【机器学习随笔】PCA降维与SVD
  • 【记录】大模型|Windows 下 Hugging Face 上的模型的通用极简调用方式之一
  • react + antDesignPro 企业微信扫码登录
  • Java 之反射机制详解
  • MySQL中的LIMIT与ORDER BY关键字详解
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • avalon2.2的VM生成过程
  • eclipse的离线汉化
  • github从入门到放弃(1)
  • Git的一些常用操作
  • javascript从右向左截取指定位数字符的3种方法
  • Java反射-动态类加载和重新加载
  • KMP算法及优化
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • nginx 配置多 域名 + 多 https
  • PHP的类修饰符与访问修饰符
  • React-生命周期杂记
  • spark本地环境的搭建到运行第一个spark程序
  • SpriteKit 技巧之添加背景图片
  • 浮现式设计
  • 浅谈web中前端模板引擎的使用
  • 项目实战-Api的解决方案
  • 原生 js 实现移动端 Touch 滑动反弹
  • 在Mac OS X上安装 Ruby运行环境
  • 正则表达式
  • ​Benvista PhotoZoom Pro 9.0.4新功能介绍
  • # Spring Cloud Alibaba Nacos_配置中心与服务发现(四)
  • #14vue3生成表单并跳转到外部地址的方式
  • #FPGA(基础知识)
  • (13)DroneCAN 适配器节点(一)
  • (leetcode学习)236. 二叉树的最近公共祖先
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (南京观海微电子)——COF介绍
  • (十八)三元表达式和列表解析
  • (一)基于IDEA的JAVA基础10
  • (译) 函数式 JS #1:简介
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转)大道至简,职场上做人做事做管理