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

网络编程、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); 返回值&#xff1a;> 0 代表函数调用成功&#xff0c;这个值是一个文件描述符< 0 代表函数调用失败 int domain&#xff1a;地址簇 AF_INET&#xff1a;IPv4 AF_INET6: IPv6 ​ i…...

Elasticsearch:自动使用服务器时间设置日期字段并更新时区

在大多数情况下&#xff0c;你的数据包含一个以 create_date 命名的字段。 即使没有日期字段&#xff0c;处理各种格式和时区的日期对数据仓库来说也是一个重大挑战。 与此类似&#xff0c;如果要检测变化的数据&#xff0c;则必须准确设置日期字段。 在 Elasticsearch 中还有…...

网络技术三:局域网基本原理

局域网基本原理 使用的协议及线缆 物理层 双绞线 同轴电缆 光纤 无线电 数据链路层 以太网 唯一事实标准 令牌环 淘汰 FDDI 光纤分布式接口 网络层 IP 唯一的事实标准 IPX 淘汰 Apple talk 淘汰 局域网设备 集线器 内部为总线型拓扑 任意时间只能由一台主机占用总线&a…...

Fine-tuning Large Enterprise Language Models via Ontological Reasoning

本文是LLM系列文章&#xff0c;针对《Fine-tuning Large Enterprise Language Models via Ontological Reasoning》的翻译。 基于本体论推理的大型企业语言模型微调 摘要1 引言2 微调LLM的神经符号管道3 通过概念证明进行初步验证4 结论 摘要 大型语言模型&#xff08;LLM&am…...

2023年全国职业院校技能大赛 高等职业教育组(信息安全管理与评估)正式赛题

全国职业院校技能大赛 高等职业教育组 qq:2366046367 q群:670610200信息安全管理与评估 任务书 模块一 网络平台搭建与设备安全防护 一、 比赛时间 本阶段比赛时长为180分钟。 二、 赛项信息 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第一阶段 网络平台搭建与设备安全防护 …...

基于SSM的校园驿站管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…...

分布式实时仿真系统-反射内存的应用

为了使分布式实时仿真系统(一个典型代表就行飞行模拟器)达到逼真的仿真效果&#xff0c;在系统内部&#xff0c;往往不仅需要对各种数据模型进行实时解算&#xff0c;而且需要一个延迟时间极低的确定性网络在系统之间传递数据&#xff0c;这样才能让各个子系统之间协调一致地工…...

【python技巧】替换文件中的某几行

【python技巧】替换文件中的某几行 1. 背景描述2. 单行修改-操作步骤3. 多行修改-操作步骤 1. 背景描述 最近在写一个后端项目&#xff0c;主要的操作就是根据用户的前端数据&#xff0c;在后端打开项目中的代码文件&#xff0c;修改对应位置的参数&#xff0c;因为在目前的后…...

内网建自己的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进行了一些具体的改进&#xff0c;主要包括以下几个方面&#xff1a; Patch flag&#xff1a;Vue 3引入了Patch flag的概念&#xff0c;用于标记组件在更新过程中的一些特殊情况&#xff0c;例如组件的props发生变化或只需要强制更新等。这样可以在Dif…...

网络面试题整理

TCP通讯原理&#xff1a;三次握手&#xff0c;四次挥手 TCP&#xff08;Transmission Control Protocol&#xff09;通信中的"三次握手"和"四次挥手"是建立和终止TCP连接时的标准过程&#xff0c;用于确保数据的可靠传输和连接的正确关闭。 三次握手&…...

Liquid Studio 2023.2 Crack

Liquid Studio 提供了用于XML和JSON开发 的高级工具包以及Web 服务测试、数据映射和数据转换工具。 开发环境包含一整套用于设计 XML 和 JSON 数据结构和模式的工具。这些工具提供编辑、验证和高级转换功能。对于新手或专家来说&#xff0c;直观的界面和全面的功能将帮助您节省…...

企业架构LNMP学习笔记8

1、 运维人员需要考虑安全性、稳定性。 安装&#xff1a; 解压进入到目录&#xff1a; shell > tar zxf php-7.2.12.tar.gz shell > cd php-7.2.12 安装依赖软件&#xff1a; yum -y install libxml2-devel libjpeg-devel libpng-devel freetype-devel curl-devel op…...

简单使用_matlab生成数据帧

文章目录 生成数据帧参考 生成数据帧 代码如下&#xff0c;代码很简单&#xff0c;有几点要注意&#xff0c; 较高版本的MATLAB中支持0x的写法使用bitand进行位运算使用strcat函数进行字符串拼接时&#xff0c;如果需要插入空格&#xff0c;要使用双引号 cmd_ay(1) 0x33; …...

uni-app语音转文字功能demo(同声传译)

目录 首先去微信开发者官网申请一下同声传译的插件 微信公众平台 在文件中开始引用&#xff1a; 首先去微信开发者官网申请一下同声传译的插件 微信公众平台 后续使用的时候可以看详情里面的信息进行使用 在文件中开始引用&#xff1a; 注意&#xff01;&#xff01;在这个…...

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显示

注&#xff1a;大部分参考内容来自“征途Pro《FPGA Verilog开发实战指南——基于Altera EP4CE10》2021.7.10&#xff08;上&#xff09;” 贴个下载地址&#xff1a; 野火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&#xff1a;RequestMapping 知识点2&#xff1a;RequestParam 2.3 路径传参 知识点3&#xff1…...

Android图形-Hardware Composer HAL

目录 一、引言 二、概览 三、实现HWC 3.1 为什么是HWC&#xff1f; 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 普及组] 奖学金

题目描述 某小学最近得到了一笔赞助&#xff0c;打算拿出其中一部分为学习成绩优秀的前 5 5 5 名学生发奖学金。期末&#xff0c;每个学生都有 3 3 3 门课的成绩:语文、数学、英语。先按总分从高到低排序&#xff0c;如果两个同学总分相同&#xff0c;再按语文成绩从高到低排…...

独立开发者如何借助Taotoken多模型能力打造全能AI助手应用

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 独立开发者如何借助Taotoken多模型能力打造全能AI助手应用 对于独立开发者或小型工作室而言&#xff0c;构建一个功能全面的AI助手…...

ESP32-S2物联网实战:IPv6配置与Adafruit IO双向通信

1. 项目概述与核心价值如果你手头有一块ESP32-S2开发板&#xff0c;并且已经厌倦了仅仅让它连上Wi-Fi、点个灯&#xff0c;想让它真正“活”起来&#xff0c;成为一个能融入现代互联网、能与云端自由对话的智能节点&#xff0c;那么这篇文章就是为你准备的。我们将深入两个在物…...

如何免费下载百度文库文档:三步搞定PDF保存的终极指南

如何免费下载百度文库文档&#xff1a;三步搞定PDF保存的终极指南 【免费下载链接】baidu-wenku fetch the document for free 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wenku 你是否经常在百度文库找到完美的学习资料或工作报告&#xff0c;却因为需要下载券…...

手把手教你用三菱FX3U PLC的RS指令和RS2指令与电脑串口调试助手‘对话’

三菱FX3U PLC串口通信实战&#xff1a;从零搭建RS485数据收发系统 第一次接触工业控制系统的串口通信时&#xff0c;我被那些密密麻麻的接线和晦涩的协议参数弄得晕头转向。直到在自动化生产线上亲眼看到PLC通过两根电线与十几台设备稳定通信&#xff0c;才意识到串口技术的精妙…...

2019 年旧作升级!用木材与电路打造更美观的电压表时钟

2019 年旧作升级&#xff01;用木材与电路打造更美观的电压表时钟早在 2019 年&#xff0c;作者制作了一个简单的电压表时钟&#xff0c;这类时钟使用模拟面板电压表来显示时间&#xff0c;而非传统钟面。不过&#xff0c;网上大多数此类设计过于复杂且不太美观&#xff0c;于是…...

JVM调优实战:让你的服务性能提升50%

一、背景 线上一个核心订单服务&#xff0c;QPS 3000左右&#xff0c;经常出现接口超时告警。监控显示&#xff1a; 平均RT: 180ms&#xff08;要求<100ms&#xff09;Full GC频率: 每天20次&#xff0c;每次STW 1.5sCPU使用率: 峰值85%服务规格: 8C16G&#xff0c;堆内存…...

英雄联盟智能助手Seraphine:告别手动查询,实现高效游戏决策自动化

英雄联盟智能助手Seraphine&#xff1a;告别手动查询&#xff0c;实现高效游戏决策自动化 【免费下载链接】Seraphine 英雄联盟战绩查询工具 项目地址: https://gitcode.com/gh_mirrors/se/Seraphine 在英雄联盟排位赛中&#xff0c;你是否曾因错过接受对局而懊恼不已&a…...

MySQL 索引底层 B+ 树原理

聊 MySQL 索引&#xff0c;不讲 B 树&#xff0c;那就是在耍流氓。 大家好&#xff0c;我是乱码字符。今天咱们深入聊聊 MySQL 索引的底层数据结构——B 树。这篇文章能让你彻底搞明白&#xff0c;为什么有时候明明加了索引&#xff0c;查询却还是慢成狗。 先说说为什么要用树结…...

AI原生产品管理:多智能体协作如何重塑产品开发工作流

1. 项目概述&#xff1a;当AI成为你的产品经理最近在GitHub上看到一个挺有意思的项目&#xff0c;叫NathanJCW/ai-native-pm-cortex。光看名字&#xff0c;你大概能猜到它想做什么——“AI原生的产品经理大脑”。这可不是一个简单的聊天机器人插件&#xff0c;它试图构建一个完…...

fold命令行工具:高效文本数据聚合与分析的瑞士军刀

1. 项目概述&#xff1a;一个为“折叠”而生的高效工具 最近在折腾一些数据处理和文件整理的工作流时&#xff0c;我一直在寻找一个能让我“折叠”起来思考的工具。我说的“折叠”&#xff0c;不是物理上的&#xff0c;而是逻辑上的——把复杂的、多维度的信息&#xff0c;按照…...