网络编程——套接字和字节序

目录

  • 一、BSD套接字接口
    • 1.1 套接字类型
    • 1.2 套接字的位置
  • 二、字节序
    • 2.1 大小端
    • 2.2 大小端判断
    • 2.3 主机字节序和网络字节序
    • 2.4 字节序转换函数

一、BSD套接字接口

BSD套接字接口是BSD的进程间通信的方式,它不仅支持各种形式的网络应用而且它还是一种进程间通信的机制。一个套接字描述一个
通信连接的一-端,两个相互通信的进程,每个都需要-一个套接字描述它们之间的通信连接的端点。套接字可以看成是一种特殊的管道,与管道不同的是套接字所能容纳的数据不受限制。

1.1 套接字类型

Linux BSD支持如下类型的套接字:
(1) 流式套接字(SOCK_STREAM) 。这个套接字提供了两个方向的序列数据流,这些数据流保证在传输过程中数据不丢失、破坏或重复。数据流套接字由Internet (INET)地址族的TCP协议所支持。
(2) 数据报套接字(SOCK_DGRAM) 。这个套接字也提供两个方向上的数据传送,但不像数据流套接字,它们不提供消息到达的保证。即使到达也不保证这些数据包按照一定的顺序到达或丢失、重复。这种类型的套接字由Internet 地址族的UDP协议所支持。
(3) 原始套接字(SOCK_RAW)。这种类型的套接字允许进程直接访问底层协议。例如,可以为以太网设备打开一个Raw Socket,以使用原始IP数据

利用套接字进行通信的进程采用客户机/服务器(C/S)模式。服务器提供服务而客户机则使用服务器提供的服务。使用套接字的服务器首先建立一个套接字,然后用一个名称对这个套接字进行绑定。这个名称的格式独立于套接字的地址族,它是有效的服务器的本地地址。套接字的名称或地址由sockaddr 结构来指定,一个INET套接字由一个IP端口地址与之绑定。常用服务的注册端口可以在/etc/services中看到,例如,端口80是Web服务器的特定端口。当给一个套接字绑定一个地址后,服务器侦听输入请求指定的绑定地址的连接。客户建立一个套接字和一个基于它的连接请求,这个连接请求指定目的服务器的地址。对一个INET套接字来讲,服务器的地址是它的IP地址和端口号。这些传入的请求必须通过各种不同的协议层向上找到自己的通路,然后等待服务器侦听套接字。一旦服务器收到请求,它要么接收要么拒绝。如果传入请求将被接收,服务器必须建立一个新的套接字用来接收。如果一个套接字已经用来侦听传入的连接请求,那么它不能用来支持一个连接。

1.2 套接字的位置

在这里插入图片描述

二、字节序

字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序。

2.1 大小端

按字节的排列顺序可分为如下两种:

  • 小端序(little-endian) - 低序字节存储在低地址 (主机字节序)
  • 大端序(big-endian)- 高序字节存储在低地址 (网络字节序)

2.2 大小端判断

写一个函数,判断当前主机的字节序?
有三种测试方式:

  1. 指针强转
  2. 共用体测试
  3. 数据类型强转
    在这里插入图片描述

2.3 主机字节序和网络字节序

Linux系统和Windows系统的数据是小端存储的,存放于本地计算机的字节序可以成为主机字节序;网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用大端(big endian)排序方式。

2.4 字节序转换函数

  1. 主机字节序 → 网络字节序
    u_long htonl (u_long hostlong);
    u_short htons (u_short short); //掌握这个
  2. 网络字节序 → 主机字节序
    u_long ntohl (u_long hostlong);
    u_short ntohs (u_short short);
  3. IP地址转换(点分十进制←→网络字节序)
    typedef uint32_t in_addr_t;
    struct in_addr {
    in_addr_t s_addr;
    };
    in_addr_t inet_addr(const char *cp); // 点分十进制字符串IP地址转为32位无符号整数网络字节序
    char *inet_ntoa(struct in_addr in); // 从网络字节序转为点分十进制字符串IP地址

例子:
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/111257.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

汽车类 ±0.25°C SPI 温度传感器,TMP126EDBVRQ1、TMP126EDCKRQ1、TMP127EDBVRQ1引脚配置图

一、概述 TMP126-Q1 是一款精度为 0.25C 的数字温度传感器 , 支持的环境温度范围为 -55C 至 175C 。TMP126-Q1 具 有 14 位 ( 有符号 ) 温度分辨率(0.03125C/LSB),并且可在 1.62V 至 5.5V 的电源电压范围内工作。TMP126-Q1 具有转…

Linux-crontab使用问题解决

添加定时进程 终端输入: crontab -e选择文本编辑方式,写入要运行的脚本,以及时间要求。 注意,如果有多个运行指令分两种情况: 1.多个运行指令之间没有耦合关系,分别独立,则可以直接分为两个…

SpringDataRedis 使用

1. SpringDataRedis 特点2. 使用 SpringDataRedis 步骤3. 自定义 RedisTemplate 序列化4. SpringDataRedis 操作对象 1. SpringDataRedis 特点 提供了对不同 Redis 客户端的整合(Lettuce 和 Jedis)提供了 RedisTemplate 统一 API 来操作 Redis支持 Redi…

【附安装包】Vm虚拟机安装Linux系统教程

软件下载 软件:Linux版本:18.0.4语言:简体中文大小:1.82G安装环境:VMware硬件要求:CPU2.0GHz 内存4G(或更高)下载通道①丨百度网盘:1.Vm虚拟机15.5下载链接:https://pan…

Ansible学习笔记(一)

1.什么是Ansible 官方网站:https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html Ansible是一个配置管理和配置工具,类似于Chef,Puppet或Salt。这是一款很简单也很容易入门的部署工具,它使用SS…

【USRP】集成化仪器系列1 :信号源,基于labview实现

USRP 信号源 1、设备IP地址:默认为192.168.10.2,请勿 修改,运行阶段无法修改。 2、天线输出端口是TX1,请勿修改。 3、通道:0 对应RF A、1 对应 RF B,运行 阶段无法修改。 4、中心频率:当需要…

MySQL的共享锁和排他锁

锁定读 Locking Reads 有过编程语言并发学习经验的同学,应该都了解过读写锁的概念。读写锁主要是为了解决多读少写条件下,程序的并发性能问题。它的特点即是:如果一个线程持有了读锁,那么其他线程也是可以继续读取它锁定的数据&a…

CANOCO5.0实现冗余分析(RDA)最详细步骤

在地理及生态领域会常使用RDA分析,RDA的实现路径也有很多,今天介绍一下CANOCO软件的实现方法。 1.软件安装 时间调整到2010年 2.数据处理 得有不同的物种或者样点数值,再加上环境因子数据。 3.软件运行 4.结果解读 结果解读主要把握这几点…

Pytorch-以数字识别更好地入门深度学习

目录 一、数据介绍 二、下载数据 三、可视化数据 四、模型构建 五、模型训练 六、模型预测 一、数据介绍 MNIST数据集是深度学习入门的经典案例,因为它具有以下优点: 1. 数据量小,计算速度快。MNIST数据集包含60000个训练样本和1000…

【复杂网络建模】——ER网络和SF网络的阈值分析

目录 1、介绍ER网络和SF网络 2、计算网络阈值 2.1 ER(Erdős-Rnyi)网络 2.2 SF(Scale-Free)网络 3、 研究网络阈值的意义 1、介绍ER网络和SF网络 在复杂网络理论中,ER网络(Erdős-Rnyi网络&#xff…

mybatis:动态sql【2】+转义符+缓存

目录 一、动态sql 1.set、if 2.foreach 二、转义符 三、缓存cache 1. 一级缓存 2. 二级缓存 一、动态sql 1.set、if 在update语句中使用set标签&#xff0c;动态更新set后的sql语句&#xff0c;&#xff0c;if作为判断条件。 <update id"updateStuent" pa…

【USRP】集成化仪器系列3 :频谱仪,基于labview实现

USRP 频谱仪 1、设备IP地址&#xff1a;默认为192.168.10.2&#xff0c;请勿 修改&#xff0c;运行阶段无法修改。 2、天线输出端口是TX1&#xff0c;请勿修改。 3、通道&#xff1a;0 对应RF A、1 对应 RF B&#xff0c;运行 阶段无法修改。 4、中心频率&#xff1a;当需要…

Unity 结构少继承多组合

为什么不推荐使用继承&#xff1f; 继承是面向对象的四大特性之一&#xff0c;用来表示类之间的 is-a 关系&#xff0c;可以解决代码复用的问题。虽然继承有诸多作用&#xff0c;但继承层次过深、过复杂&#xff0c;也会影响到代码的可维护性。所以&#xff0c;对于是否应该在…

程序员为什么要写bug,不能一次性写好吗?

仅仅听到“Bug”这个词就会让你作为一个开发人员感到畏缩。我们相信&#xff0c;优秀的程序员是那些编写无错误代码的人。随着一些开发人员强调要成为一名零错误程序员&#xff0c;我们进行了更深刻的思考&#xff0c;并发现事实的准确性。 所有制作的软件都应该没有错误。对此…

强化学习笔记

马尔科夫决策过程 markov chain&#xff1a; S \mathcal{S} S MRP&#xff1a; S &#xff0c; R \mathcal{S&#xff0c;R} S&#xff0c;R MDP&#xff1a; S &#xff0c; A ( s ) &#xff0c; R &#xff0c; P \mathcal{S&#xff0c;A(s)&#xff0c;R&#xff0c;P} …

在 Redis 中处理键值 | Navicat

Redis 是一个键值存储系统&#xff0c;允许我们将值与键相关联起来。与关系型数据库不同的是&#xff0c; 在Redis 中&#xff0c;不需要使用数据操作语言 &#xff08;DML&#xff09; 和查询语法&#xff0c;那么我们如何进行数据的写入、读取、更新和删除操作呢&#xff1f;…

怎么检测UI卡顿?(线上及线下)

什么是UI卡顿&#xff1f; 在Android系统中&#xff0c;我们知道UI线程负责我们所有视图的布局&#xff0c;渲染工作&#xff0c;UI在更新期间&#xff0c;如果UI线程的执行时间超过16ms&#xff0c;则会产生丢帧的现象&#xff0c;而大量的丢帧就会造成卡顿&#xff0c;影响用…

prometheus + grafana进行服务器资源监控

在性能测试中&#xff0c;服务器资源是值得关注一项内容&#xff0c;目前&#xff0c;市面上已经有很多的服务器资 源监控方法和各种不同的监控工具&#xff0c;方便在各个项目中使用。 但是&#xff0c;在性能测试中&#xff0c;究竟哪些指标值得被关注呢&#xff1f; 监控有…

springcloud-gateway简述

Spring Cloud Gateway 是一个用于构建 API 网关的项目&#xff0c;它是 Spring Cloud 生态系统中的一部分&#xff0c;旨在为微服务架构提供动态路由、负载均衡、安全性和监控等功能。 网关工程对应pom文件 <?xml version"1.0" encoding"UTF-8"?>…

【ag-grid-vue】基本使用

ag-grid是一款功能和性能强大外观漂亮的表格插件&#xff0c;ag-grid几乎能满足你对数据表格所有需求。固定列、拖动列大小和位置、多表头、自定义排序等等各种常用又必不可少功能。关于收费的问题&#xff0c;绝大部分应用用免费的社区版就够了&#xff0c;ag-grid-community社…