【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、…...
在线就能用的主图设计素材,免费分享!
如何给自己的店铺商品设计专属的节日活动主图?没有节日活动的主体素材要如何设计?下面小编就分享一个在线素材设计工具,打开乔拓云,平台里面不仅有许多能使用的电商设计素材,还有许多的设计工具和模板能帮助你快速的实…...
【测绘程序设计】——计算卫星位置
本文分享了根据广播星历计算卫星于瞬时地固系下位置的计算程序(C#版)(注:瞬时地球坐标系坐标经极移改正即可获得协议地球坐标系坐标),相关源代码(完整工程,直接运行;包含实验数据)及使用示例如下。 目录 Part.Ⅰ 使用示例Part.Ⅱ 代码分析Chap.Ⅰ 数据结构Chap.Ⅱ 计…...
山东双软认证的基本条件
一、山东双软认证的基本条件 "双软认证"是指软件产品评估和软件企业评估;企业申请双软认证除了获得软件企业和软件产品的认证资质,同时也是对企业知识产权的一种保护方式,更可以让企业享受国家提供给软件行业的税收优惠政策;我们…...
TPM 2.0实例探索3 —— LUKS磁盘加密(4)
接前文:TPM 2.0实例探索2 —— LUKS磁盘加密(3) 本文大部分内容参考: Code Sample: Protecting secret data and keys using Intel Platform... 二、LUKS磁盘加密实例 4. 将密码存储于TPM的PCR TPM平台配置寄存器(…...
Linux连接RDP远程服务工具集记录
目录 rdesktop 安装 实例 xfreerdp 安装 实例 remmia 介绍 rdesktop 安装...
离散事件动态系统
文章目录离散事件动态系统ppt离散事件系统建模离散事件动态系统的基本组成元素离散事件动态系统仿真具体建模petri建模实例离散事件动态系统 ppt ppt 仿真建模步骤 离散事件系统建模 from:离散事件系统建模 离散事件动态系统的基本组成元素 (1&am…...
无线WiFi安全渗透与攻防(二)之打造专属字典
系列文章 无线WiFi安全渗透与攻防(一)之无线安全环境搭建 打造专属字典 什么在破解之前先准备专用字典,因为对于一般家庭来说,常用 一个是预共享密钥PSK,一个是PIN码。 也不是所有的路由都开起了PIN码,一般都会开启域共享密钥…...
拥抱 Spring 全新 OAuth 解决方案
以下全文 Spring Authorization Server 简称为: SAS 背景 Spring 团队正式宣布 Spring Security OAuth 停止维护,该项目将不会再进行任何的迭代目前 Spring 生态中的 OAuth2 授权服务器是 Spring Authorization Server 已经可以正式生产使用 作为 SpringBoot 3.0 的…...
前端开发与vscode开发工具介绍
文章目录1、前端开发2、vscode安装和使用2.1、下载地址2.2、插件安装2.3、设置字体大小2.4、开启完整的Emmet语法支持2.5、创建项目2.6、保存工作区2.7、新建文件夹和网页1、前端开发 前端工程师“Front-End-Developer”源自于美国。大约从2005年开始正式的前端工程师角色被行…...
C++---最长上升子序列模型---友好城市(每日一道算法2023.3.2)
注意事项: 本题为"线性dp—最长上升子序列的长度"的扩展题,所以dp思路这里就不再赘述。 题目: Palmia国有一条横贯东西的大河,河有笔直的南北两岸,岸上各有位置各不相同的N个城市。 北岸的每个城市有且仅有…...
英文医疗网站建设/nba排名最新赛程
B树索引、位图索引和散列索引 1.B树索引结构:特点:1.B*Tree 索引不存储null值 。更准确的说,单列索引不存储null值,复合索引不存储全为null的值,因为索引上如果有Null值&…...
顺企网是什么网站/代发软文
本文目录1.数据库备份2.数据库恢复3.数据库权限管理4.视图测试5.数据库功能测试6.数据操作和更新7.数据的完整性8.数据的有效性9.数据库安全测试10.并发处理测试11.数据库性能测试12.空数据库测试13.SQL语句优化14.存储过程的接口测试15.触发器的接口测试16.结合业务逻辑做关联…...
页面模板 公众号/seo关键词优化排名哪家好
7、约束(非常重要,五颗星*****) 7.1、什么是约束? 约束对应的英语单词:constraint 在创建表的时候,我们可以给表中的字段加上一些约束,来保证这个表中数据的 完整性、有效性&#…...
企通互联的网站建设失败/合肥网站快速优化排名
古人云 “读万卷书,行万里路。” 书籍是人类进步的阶梯、培养阅读习惯,当一个人爱上读书的时候,眼睛都是发光的。 在小编看来,学习理念是【先广度后深度】,先把Java知识体系的东西都了解到,工作上先会用&…...
虚拟机安装 wordpress/网站推广计划书范文
list和str转换分为两种类型类型一:将字符串以一定的分割符分割成不同的元素,通过元素组成列表方法1:利用strip和split函数常用示例:str转list数据以列表的形式的字符串,转换为列表例如 response"[a,b,c]"str…...
怎么攻击织梦网站/网络营销与直播电商
给定一个二叉树,找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子节点的节点。 示例: 给定二叉树 [3,9,20,null,null,15,7],3/ \9 20/ \15 7 返回它的最大深度 3 。 java代码的…...