网络编程、socket编程、多进程并发服务器
网络编程
一、TCP编程的API
socket:
int socket(int domain, int type, int protocol); 返回值:> 0 代表函数调用成功,这个值是一个文件描述符< 0 代表函数调用失败 int domain:地址簇 AF_INET:IPv4 AF_INET6: IPv6 int type: 套接字类型 SOCK_STREAM:流式套接字 唯一对应TCP SOCK_DGRAM: 数据报套接字 唯一对应UDPSOCK_RAW: 原始套接字 针对较低层次协议 int protocol: 默认为0
bind:
/*绑定通信IP和端口*/
struct sockaddr_in {sa_family_t sin_family; /* 地址族: AF_INET 2字节 */u_int16_t sin_port; /* 按网络字节次序的端口 2字节*/struct in_addr sin_addr; /* internet地址 */};
/* Internet地址. */struct in_addr {u_int32_t s_addr; /* 按网络字节次序的地址 */};
struct sockaddr_in sddr;
bzero(&sddr, sizeof(sddr)); //将sddr做清0操作
uint16_t htons(uint16_t hostshort);
把本机字节序转为网络字节序
uint16_t ntohs(uint16_t netshort);
把网络字节序转为本机字节序
int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);
返回值:成功 0失败 -1
int sockfd: 代表socket成功返回的文件描述符
struct sockaddr *my_addr : 要绑定的IP和端口
socklen_t addrlen : 要绑定的IP和端口的结构体的大小
listen:
int listen(int s, int backlog); 返回值: 成功 0失败 -1 int s: socket打开的文件描述符 int backlog : 允许监听的套接字队列元素的最大个数 (数目和性能产生联系)
accept:
int accept(int s, struct sockaddr *addr, socklen_t *addrlen); 返回值: 失败 -1成功 非负整数 int s: socket返回的文件描述 struct sockaddr *addr: 存储连接进来的客户端的IP和端口 (NULL不关注客户端的信息) socklen_t *addrlen: 结构体的大小
connect:
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen); 返回值: 成功 0失败 -1 int sockfd: socket返回的文件描述符 struct sockaddr *addr: 要连接的服务器的IP和PORT socklen_t addrlen: 存储要连接服务器IP和PORT的结构体的长度
read函数的返回值分析
返回值为 -1 :read发生错误
返回值为0 :表示另外一端掉线
返回值大于0:表示实际读取到的字节数
注意:如果处于连接状态,且缓冲区没有内容,read会阻塞
send:
发送数据,专属网络编程
ssize_t send(int sockfd, const void *buf, size_t len, int flags); int sockfd : 发送的目标套接字的文件描述符(对象) const void *buf : 要发送的内容缓冲区的首地址 size_t len : 要发送内容的大小(字节为单位) int flags : 为0效果和write一摸一样(绝大多时刻选择参数)为MSG_DONTWAIT时,它是非阻塞模式 ssize_t : >0 表示实际发送的字节数: -1 表示发送失败
recv:
发送数据,专属网络编程
ssize_t recv(int sockfd, void *buf, size_t len, int flags); int sockfd : 接收数据对象的文件描述符 const void *buf : 接收数据存储的缓冲区首地址 size_t len : 期望要接收内容的大小(字节为单位) int flags : 为0效果和read一摸一样(绝大多时刻选择参数)为MSG_DONTWAIT时,它是非阻塞模式 ssize_t : >0 表示实际接收的字节数: -1 表示接收失败: 0 表示另外一端退出或者关闭或者掉线
sendto:
UDP编程使用的发送函数
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen); int sockfd : 发送的目标套接字的文件描述符(对象) const void *buf : 要发送的内容缓冲区的首地址 size_t len : 要发送内容的大小(字节为单位) int flags : 默认为0 const struct sockaddr *dest_addr: 发送的对象(对象的IP PORT) socklen_t addrlen: : 上一个参数的长度 ssize_t : >0 表示实际发送的字节数: -1 表示发送失败
recvfrom:
UDP编程使用的发送函数
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen); int sockfd : 接收数据对象的文件描述符 const void *buf : 接收数据存储的缓冲区首地址 size_t len : 期望要接收内容的大小(字节为单位) int flags : 默认为0 struct sockaddr *src_addr : 发送方的信息(IP PORT) socklen_t *addrlen : 上一个参数的长度 ssize_t : >0 表示实际接收的字节数: -1 表示接收失败
二、TCP服务器的模型
1、循环服务器
socket(...);
bind(...);
listen(...);
accept(...);
while(1){read(...);...write(...);
}
TCP循环服务器用的相对较少
2、并发服务器
并发服务器实现原理是多次调用accept函数
多线程实现并发
socket(...);
bind(...);
listen(...);
while(1){accept(...);pthread_create(...); //创建线程处理新的链接
}
多进程实现并发
socket(...);
bind(...);
listen(...);
while(1){accept(...);fork(...); //创建子进程处理新的链接
}
记得回收子进程,否则会出现僵尸进程
服务器代码:
#include <sys/wait.h>
#include <signal.h>
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<sys/socket.h>
#include<fcntl.h>
#include<string.h>
#include<stdlib.h>
#include<netinet/ip.h>
#include<arpa/inet.h>#define SIZE 64int tcp_server_init(const char *ip,int port,int backlog)
{int fd=socket(AF_INET,SOCK_STREAM,0);if(-1==fd){return -1;}struct sockaddr_in sddr;sddr.sin_family =AF_INET;sddr.sin_port=htons(port);sddr.sin_addr.s_addr=inet_addr(ip);if(-1==bind(fd,(struct sockaddr *)&sddr,sizeof(sddr))){return -1;}if(-1==listen(fd,backlog)){return -1;}puts("listen...");return fd;
}
int tcp_server_wait(int fd)
{struct sockaddr_in cddr;socklen_t len =sizeof(cddr);int nfd=accept(fd,(void*)&cddr,&len);if(-1==nfd){return -1;}printf("IP:%s PORT:%hd\n",inet_ntoa(cddr.sin_addr),cddr.sin_port);return nfd;
}void signal_handler(int no)
{pid_t pid=waitpid(-1,NULL,WNOHANG);printf("%d 被回收!\n",pid);
}void child_handler(int fd)
{char buf[SIZE];int ret;while(1){ret=read(fd,buf,SIZE);if(0>=ret){exit(0);}if(0==strncmp(buf,"quit",4)){exit(0);}sprintf(buf,"Recv size:%d",ret);write(fd,buf,SIZE);}
}
int main(int argc, char *argv[])
{int fd=tcp_server_init("0",8881,20);if(-1==fd){perror("tcp init");return -1;}int nfd;signal(SIGCHLD,signal_handler);while(1){nfd=tcp_server_wait(fd);if(-1==nfd){continue;}pid_t pid =fork();if(-1==pid){close(nfd);continue;}else if(0==pid){close(fd);//子进程值负责通信不负责监听连接,所以关闭监听套接字//子进程去处理连接的客户端的请求child_handler(nfd);}else{close(nfd); //父进程只负责监听连接,所以关闭通信套接字}}return 0;
}
相关文章:
网络编程、socket编程、多进程并发服务器
网络编程 一、TCP编程的API socket: int socket(int domain, int type, int protocol); 返回值:> 0 代表函数调用成功,这个值是一个文件描述符< 0 代表函数调用失败 int domain:地址簇 AF_INET:IPv4 AF_INET6: IPv6 i…...
Elasticsearch:自动使用服务器时间设置日期字段并更新时区
在大多数情况下,你的数据包含一个以 create_date 命名的字段。 即使没有日期字段,处理各种格式和时区的日期对数据仓库来说也是一个重大挑战。 与此类似,如果要检测变化的数据,则必须准确设置日期字段。 在 Elasticsearch 中还有…...
网络技术三:局域网基本原理
局域网基本原理 使用的协议及线缆 物理层 双绞线 同轴电缆 光纤 无线电 数据链路层 以太网 唯一事实标准 令牌环 淘汰 FDDI 光纤分布式接口 网络层 IP 唯一的事实标准 IPX 淘汰 Apple talk 淘汰 局域网设备 集线器 内部为总线型拓扑 任意时间只能由一台主机占用总线&a…...
Fine-tuning Large Enterprise Language Models via Ontological Reasoning
本文是LLM系列文章,针对《Fine-tuning Large Enterprise Language Models via Ontological Reasoning》的翻译。 基于本体论推理的大型企业语言模型微调 摘要1 引言2 微调LLM的神经符号管道3 通过概念证明进行初步验证4 结论 摘要 大型语言模型(LLM&am…...
2023年全国职业院校技能大赛 高等职业教育组(信息安全管理与评估)正式赛题
全国职业院校技能大赛 高等职业教育组 qq:2366046367 q群:670610200信息安全管理与评估 任务书 模块一 网络平台搭建与设备安全防护 一、 比赛时间 本阶段比赛时长为180分钟。 二、 赛项信息 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第一阶段 网络平台搭建与设备安全防护 …...
基于SSM的校园驿站管理系统
末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…...
分布式实时仿真系统-反射内存的应用
为了使分布式实时仿真系统(一个典型代表就行飞行模拟器)达到逼真的仿真效果,在系统内部,往往不仅需要对各种数据模型进行实时解算,而且需要一个延迟时间极低的确定性网络在系统之间传递数据,这样才能让各个子系统之间协调一致地工…...
【python技巧】替换文件中的某几行
【python技巧】替换文件中的某几行 1. 背景描述2. 单行修改-操作步骤3. 多行修改-操作步骤 1. 背景描述 最近在写一个后端项目,主要的操作就是根据用户的前端数据,在后端打开项目中的代码文件,修改对应位置的参数,因为在目前的后…...
内网建自己的pip源
内网建自己的pip源 一. 下载数据包二. 建立索引三. 安装nginx四. 配置nginx五.展示 一. 下载数据包 以清华源为示例 import requests import bs4 import re import wget a requests.get("https://pypi.tuna.tsinghua.edu.cn/simple").text b bs4.BeautifulSoup(a…...
Vue 3的Diff算法相比Vue 2有哪些具体的改进?
Vue 3的Diff算法相比Vue 2进行了一些具体的改进,主要包括以下几个方面: Patch flag:Vue 3引入了Patch flag的概念,用于标记组件在更新过程中的一些特殊情况,例如组件的props发生变化或只需要强制更新等。这样可以在Dif…...
网络面试题整理
TCP通讯原理:三次握手,四次挥手 TCP(Transmission Control Protocol)通信中的"三次握手"和"四次挥手"是建立和终止TCP连接时的标准过程,用于确保数据的可靠传输和连接的正确关闭。 三次握手&…...
Liquid Studio 2023.2 Crack
Liquid Studio 提供了用于XML和JSON开发 的高级工具包以及Web 服务测试、数据映射和数据转换工具。 开发环境包含一整套用于设计 XML 和 JSON 数据结构和模式的工具。这些工具提供编辑、验证和高级转换功能。对于新手或专家来说,直观的界面和全面的功能将帮助您节省…...
企业架构LNMP学习笔记8
1、 运维人员需要考虑安全性、稳定性。 安装: 解压进入到目录: shell > tar zxf php-7.2.12.tar.gz shell > cd php-7.2.12 安装依赖软件: yum -y install libxml2-devel libjpeg-devel libpng-devel freetype-devel curl-devel op…...
简单使用_matlab生成数据帧
文章目录 生成数据帧参考 生成数据帧 代码如下,代码很简单,有几点要注意, 较高版本的MATLAB中支持0x的写法使用bitand进行位运算使用strcat函数进行字符串拼接时,如果需要插入空格,要使用双引号 cmd_ay(1) 0x33; …...
uni-app语音转文字功能demo(同声传译)
目录 首先去微信开发者官网申请一下同声传译的插件 微信公众平台 在文件中开始引用: 首先去微信开发者官网申请一下同声传译的插件 微信公众平台 后续使用的时候可以看详情里面的信息进行使用 在文件中开始引用: 注意!!在这个…...
vue2+element-ui批量导入方法并判断上传的文件是否为xls或xlsx
业务需求: 代码结构: <el-dialogtitle"批量导入":close-on-click-modal"true"close"close()":visible"true"width"35%":center"true"><div class"el-dialog-div"><!-- 头部区域布局 -…...
【FPGA】通俗理解从VGA显示到HDMI显示
注:大部分参考内容来自“征途Pro《FPGA Verilog开发实战指南——基于Altera EP4CE10》2021.7.10(上)” 贴个下载地址: 野火FPGA-Altera-EP4CE10征途开发板_核心板 — 野火产品资料下载中心 文档 hdmi显示器驱动设计与验证 — …...
【SpringMVC】参数传递与用户请求和响应
目录 一、Postman 工具使用 1.1 Postman安装 1.2 Postman的使用 1.2.1 创建WorkSpace工作空间 1.2.2 创建请求 二、参数传递 2.1 添加 Slf4j 依赖 2.2 普通传参 知识点1:RequestMapping 知识点2:RequestParam 2.3 路径传参 知识点3࿱…...
Android图形-Hardware Composer HAL
目录 一、引言 二、概览 三、实现HWC 3.1 为什么是HWC? 3.2 HWC的支持需求 3.3 HWC的实现思路 3.4 HWC的基元 3.5 HIDL接口 3.6 函数指针 3.7 图层和屏幕句柄 3.8 屏幕合成操作 3.9 多个屏幕 3.10 虚拟屏幕合成 3.10.1 模式 3.10.2 输出格式 3.11 同…...
P1093 [NOIP2007 普及组] 奖学金
题目描述 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前 5 5 5 名学生发奖学金。期末,每个学生都有 3 3 3 门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!
本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...
DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...
【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权
摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题:安全。文章将详细阐述认证(Authentication) 与授权(Authorization的核心概念,对比传统 Session-Cookie 与现代 JWT(JS…...
Java数组Arrays操作全攻略
Arrays类的概述 Java中的Arrays类位于java.util包中,提供了一系列静态方法用于操作数组(如排序、搜索、填充、比较等)。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序(sort) 对数组进行升序…...
CppCon 2015 学习:REFLECTION TECHNIQUES IN C++
关于 Reflection(反射) 这个概念,总结一下: Reflection(反射)是什么? 反射是对类型的自我检查能力(Introspection) 可以查看类的成员变量、成员函数等信息。反射允许枚…...
Android屏幕刷新率与FPS(Frames Per Second) 120hz
Android屏幕刷新率与FPS(Frames Per Second) 120hz 屏幕刷新率是屏幕每秒钟刷新显示内容的次数,单位是赫兹(Hz)。 60Hz 屏幕:每秒刷新 60 次,每次刷新间隔约 16.67ms 90Hz 屏幕:每秒刷新 90 次,…...
Springboot 高校报修与互助平台小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,高校报修与互助平台小程序被用户普遍使用,为…...
