【socket网络编程】
socket网络编程
- 主机字节序列和网络字节序列
- 套接字地址结构
- 通用socket地址结构
- 专用的socket地址结构
- IP地址转换函数
- 网络编程接口
- TCP编程流程
- 代码举例
- 服务器代码
- 客户端
- 服务器并发处理多个客户端
- 多线程
- 多进程
主机字节序列和网络字节序列
主机字节序列分为大端模式和小端模式,不同主机可能采用的不相同。大端模式是指一个整数的高字节位存储在内存的低地址处,低位字节存储在内存的高地址处。小端则是刚好相反。在两台使用不同字节序的主机之间传递数据时,可能会出现冲突。所以,在将数据发送到网络时 规定整形数据使用大端字节序,所以也把 大端字节序成为网络字节序列。对方接收到数据后,可以根据自己的字节序进行转换。
linux提供了四个函数来完成主机字节序和网络字节序的转换。
#include <netinet/in.h>
uint32_t htonl(uint32_t hostlong);//长整型的主机字节序转网络字节序
uint32_t ntohl(uint32_t netlong);//长整型的网络字节序转主机字节序
uint16_t htons(uint16_t hostshort);//短整型的主机字节序转网络字节序
uint16_t ntohs(uint16_t netshort);//短整型的网络字节序列转主机字节序列
套接字地址结构
通用socket地址结构
socket网络变成接口中表示socket地址的是结构体sockaddr,定义如下:
#include<bits/socket.h>
struct sockaddr{sa_family_t sa_family;char sa_data[14];
}
专用的socket地址结构
TCP/IP 协议族有 sockaddr_in 和 sockaddr_in6 两个专用 socket 地址结构体,它们分别用于 IPV4 和 IPV6。
1. //
2. //sin_family: 地址族 AF_INET
3. //sin_port: 端口号,需要用网络字节序表示
4. //sin_addr: IPV4 地址结构:s_addr 以网络字节序表示 IPV4 地址
5. //
6. struct in_addr
7. {
8. u_int32_t s_addr;
9. };
11.
10. struct sockaddr_in
11. {
12. sa_family_t sin_family;
13. 15. u_int16_t sin_port;
16. struct in_addr sin_addr;
17. };
18.
19. struct in6_addr
20. {
21. unsigned char sa_addr[16]; // IPV6 地址,要用网络字节序表示
22. };
23.
24. struct sockaddr_in6
25. {
26. sa_family_t sin6_family; // 地址族:AF_INET6
27. u_inet16_t sin6_port; // 端口号:用网络字节序表示
28. u_int32_t sin6_flowinfo; // 流信息,应设置为 0
29. struct in6_addr sin6_addr; // IPV6 地址结构体
30. u_int32_t sin6_scope_id; // scope ID,尚处于试验阶段
31. };
IP地址转换函数
通常,人们习惯用点分十进制字符串表示 IPV4 地址,但编程中我们需要先把它们转化为整数方能使用,下面函数可用于点分十进制字符串表示的 IPV4 地址和网络字节序整数表示的 IPV4 地址之间的转换。
#include<arpa/inet.h>
in_addr_t inet_addr(const char* cp);//字符串表示的IPV4地址转化位网络字节序
char* inet_ntoa(struct in_addr in);//IPV4地址的网络字节序转化为字符串表示
网络编程接口
#include<sys/types.h>
#inlcude<sys/socket.h>
int socket(int domain, int type, int protocol);//创建套接字,成功返回套接字文件描述符,失败返回-1
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);//bind()将 sockfd 与一个 socket 地址绑定,成功返回 0,失败返回-1
int listen(int sockfd, int backlog);//创建一个监听队列等待客户连接。
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);//accept()从 listen 监听队列中接收一个连接,成功返回一个新的连接 socket,唯一标识链接成功失败。失败返回-1int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);//客户端通过此系统来主动与服务器产生链接,成功返回0,失败返回-1.int close(int sockfd);//关闭一个连接ssize_t recv(int sockfd, void *buff, size_t len, int flags);//recv()读取 sockfd 上的数据,buff 和 len 参数分别指定读缓冲区的位置和大小ssize_t send(int sockfd, const void *buff, size_t len, int flags);// send()往 socket 上写入数据,buff 和 len 参数分别指定写缓冲区的位置和数据长度ssize_t recvfrom(int sockfd, void *buff, size_t len, int flags,struct sockaddr* src_addr, socklen_t *addrlen);//读取 sockfd 上的数据,buff 和 len 参数分别指定读缓冲区的位置和大小
ssize_t sendto(int sockfd, void *buff, size_t len, int flags,struct sockaddr* dest_addr, socklen_t addrlen);// sendto()往 socket 上写入数据,buff 和 len 参数分别指定写缓冲区的位置和数据长度
TCP编程流程
TCP提供的是面向连接的可靠的字节流服务。TCP的服务器端和客户端编程流程如下图:
socket()方法是用来创建一个套接字,有了套接字就可以通过网络进行数据的收发。
bind()方法是用来指定套接字使用的 IP 地址和端口。
listen()方法是用来创建监听队列。
accept()处理存放在 listen 创建的已完成三次握手的队列中的连接。
connect()方法一般由客户端程序执行,需要指定连接的服务器端的 IP 地址和端口。该方法执行后,会进行三次握手, 建立连接。
send()方法用来向 TCP 连接的对端发送数据。send()执行成功,只能说明将数据成功写入
到发送端的发送缓冲区中,并不能说明数据已经发送到了对端。send()的返回值为实际写入到发送缓冲区中的数据长度。
recv()方法用来接收 TCP 连接的对端发送来的数据。recv()从本端的接收缓冲区中读取数据,如果接收缓冲区中没有数据,则 recv()方法会阻塞。返回值是实际读到的字节数,如果recv()返回值为 0, 说明对方已经关闭了 TCP 连接。
close()方法用来关闭 TCP 连接。此时,会进行四次挥手。
代码举例
服务器代码


客户端

服务器并发处理多个客户端
多线程


客户端代码同上相同
多进程


相关文章:
【socket网络编程】
socket网络编程主机字节序列和网络字节序列套接字地址结构通用socket地址结构专用的socket地址结构IP地址转换函数网络编程接口TCP编程流程代码举例服务器代码客户端服务器并发处理多个客户端多线程多进程主机字节序列和网络字节序列 主机字节序列分为大端模式和小端模式&…...
【验证码逆向专栏】某验三代、四代一键通过模式逆向分析
声明 本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 本文章未经许可禁止转载…...
《MySql学习》 MySQL的 加锁规则
MySQL加锁原则 两个原则 原则 1:加锁的基本单位是 next-key lock。next-key lock 是前开后闭区间(区间锁和行锁)。原则 2:查找过程中访问到的对象(索引)才会加锁。 两个优化 1.优化 1:索引上…...
软件测试(linux命令篇-01文件操作命令)
linux文件篇命令linux系统常用文件操作命令1、查看目录内容及常用参数:ls2、目录切换:cd 3、创建文件:touch 4、创建目录 :mkdir5、 删除文件或目录:rm6、文件或目录的复制:cp7、文件或目录的移动ÿ…...
Code Virtualizer 3.1.4 Crack
Code Virtualizer 是一个强大的 Windows 应用程序代码混淆系统,它可以帮助开发人员保护他们的敏感代码区域免受逆向工程的影响,基于代码虚拟化的非常强大的混淆代码。 Code Virtualizer 会将您的原始代码(Intel x86/x64 指令)转换…...
Torch同时训练多个模型
20230302 引言 在进行具体的研究时,利用Torch进行编程,考虑到是不是能够同时训练两个模型呢?!而且利用其中一个模型的输出来辅助另外一个模型进行学习。这一点,在我看来应该是很简单的,例如GAN网络同时训…...
LCR数字电桥软件下载安装教程
软件:LCR数字电桥软件NS-LCR 语言:简体中文 环境:NI-VISA 安装环境:Win10以上版本(特殊需求请后台私信联系客服) 硬件要求:CPU2GHz 内存4G(或更高)硬盘500G(或更高) …...
C++模板写法详解
模板 概念 模板就是建立通用的模具,大大提高复用性 模板主要体现了cpp编程的另外一种思想泛型编程cpp提供两种模板机制 函数模板类模板 函数模板 作用 建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,用一个虚拟的类型来代表 语…...
【备战面试】每日10道面试题打卡-Day2
本篇总结的是Java基础知识相关的面试题,后续也会更新其他相关内容 文章目录1、 和 equals 的区别是什么?2、你重写过 hashcode 和 equals 吗,为什么重写equals时必须重写hashCode方法?3、为什么Java中只有值传递?4、BI…...
“数字档案室测评”相关参考依据梳理
数字档案室建设无疑比数字档案馆建设应用范围更为广泛,涉及的单位类型和专业领域也更多。这一点从国家档案局的机构设置上也可以看出端倪: 国家档案局两个内设业务指导司中,档案馆(室)业务指导司主要针对档案馆和机关档案室,而经济…...
android 动态加载jar包
什么时候需要用到动态加载jar包呢? 减少apk本身大小,某些界面才需要用jar里的功能jar中的功能可以独立开发,不要依赖其它的东西,能适用各个项目和第三方公司合作,人家不提供项目源码给你,但又要开发他们使…...
JAVA版B2B2C商城源码多商户入驻商城
三勾商城多商户是开发友好的微信小程序商城,框架支持SAAS,支持发布 iOS Android 公众号 H5 各种小程序(微信/支付宝/百度/头条/QQ/钉钉/淘宝)等多个平台,不可多得的二开神器, 为大中小企业提供极致的移…...
测试人员如何在测试环境数据库批量生成测试数据?方案分享
测试人员为了测试某个特定场景,往往需要在测试环境数据库中插入特定的测试数据来满足需求;性能测试时,常需要在测试环境生成大量可用测试数据来支持性能测试;建设持续集成持续交付体系时,我们往往也需要在测试环境生成…...
【el】表单
elementUI中的表单相关问题一、用法1、动态表单调用接口返回表单,后端的接口返回值如下:这些是渲染后的效果页面使用(父组件)<el-button size"small" class"Cancelbtn" click"sub(true)">发起…...
【Flutter入门到进阶】Flutter基础篇---布局
1 GridView网格布局组件 1.1 说明 1.1.1 图例 1.1.2 说明 GridView网格布局在实际项目中用的也是非常多的,当我们想让可以滚动的元素使用矩阵方式排列的时 候。此时我们可以用网格列表组件GridView实现布局 GridView创建网格列表主要有下面三种方式 1、可以通过Gr…...
python海龟绘图
一、基础 (一)介绍 海龟绘图(Turtle Graphics):“小海龟”turtle是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x、纵轴为y的坐标系原点,(0,0)位置开始…...
【计算机网络】数据链路层
概述 封装成帧 差错检验 可靠传输 实现机制 可靠传输的实现机制 停止等待协议 回退N帧协议 选择重传协议 【计算机网络】MAC帧和PPP帧(定义使用范围区别共同点)_GPNU_Log的博客-CSDN博客_ppp帧 PPP帧和以太网帧 | Mixoo 数据链路层的协议有PPP协…...
使用groovy代码方式解开gradle配置文件神秘面纱
来到这里的是不是都有以下疑问: 1.build.gradle配置文件结构好复杂啊,怎么记? 2.内部是怎么进行分析和执行的? 3.为什么可以在配置文件里面写groovy代码,怎么识别的? 4.怎么才能很方便的记住和快速上手…...
kafka入门到实战二(使用docker搭建kafka集群)
使用Docker搭建kafka单机/集群 拉取镜像:2.8.0之前,kafka都需要依赖zookeeper docker pull wurstmeister/kafka docker pull wurstmeister/zookeeper运行zookeeper镜像 docker run -d --name zookeeper -p 2181:2181 -t wurstmeister/zookeeper运行ka…...
【简化开发】lombok的使用、编译后的代码及源码
lombok的使用导入依赖一、getter、Setter、toString1、getter、Setter分别生成getxxx()和setxxx()方法2、toString生成toString()方法,按顺序打印类名称以及每个字段,并以逗号分隔二、NoArgsConstructor、RequiredArgsConstructor、AllArgsConstructor1、…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
恶补电源:1.电桥
一、元器件的选择 搜索并选择电桥,再multisim中选择FWB,就有各种型号的电桥: 电桥是用来干嘛的呢? 它是一个由四个二极管搭成的“桥梁”形状的电路,用来把交流电(AC)变成直流电(DC)。…...
篇章二 论坛系统——系统设计
目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...
AD学习(3)
1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分: (1)PCB焊盘:表层的铜 ,top层的铜 (2)管脚序号:用来关联原理图中的管脚的序号,原理图的序号需要和PCB封装一一…...
