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

目录

  • 一、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.mfbz.cn/a/90337.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MaBatis中的分页插件以及特殊字符处理

目录 一、PageHelper介绍 二、PageHelper使用 1. 导入pom依赖 2. Mybatis.cfg.xml 配置拦截器 配置sql映射文件 测试代码 特殊字符处理 2. 使用CDATA 区段 一、PageHelper介绍 PageHelper 是 Mybatis 的一个插件,这里就不扯了,就是为了更加便捷的进…

《Go 语言第一课》课程学习笔记(十)

复合数据类型 同构复合类型:从定长数组到变长切片 由多个同构类型(相同类型)或异构类型(不同类型)的元素的值组合而成,这类数据类型在 Go 语言中被称为复合类型。 数组有哪些基本特性? Go 语…

ubuntu学习(四)----文件写入操作编程

1、write函数的详解 ssize_t write(int fd,const void*buf,size_t count); 参数说明: fd:是文件描述符(write所对应的是写,即就是1) buf:通常是一个字符串,需要写入的字符串 count:是每次写入的字节数…

【宝藏系列】一文带你梳理 Linux 的五种 IO 模型

【宝藏系列】一文带你梳理 Linux 的五种 IO 模型 文章目录 【宝藏系列】一文带你梳理 Linux 的五种 IO 模型👨‍🏫前言1️⃣用户态和核心态1️⃣1️⃣用户态和核心态的切换 2️⃣进程切换3️⃣进程阻塞4️⃣文件描述符(fd, File Descriptor)5️⃣缓存I/O…

[Go版]算法通关村第十三关白银——数字数学问题之数组实现加法、幂运算

目录 数组实现加法专题题目:数组实现整数加法思路分析:数组末尾开始,逐个元素1,10就进位,!10就退出复杂度:时间复杂度 O ( n ) O(n) O(n)、空间复杂度 O ( n ) O(n) O(n)Go代码 题目:字符串加法…

大数据Flink(六十七):SQL Table 简介及运行环境

文章目录 SQL & Table 简介及运行环境 一、​​​​​​​​​​​​​​简介 二、案例

pytorch 入门1-tensor 广播 view reshape

tensor 的四则运算broadcast import torch import numpy as np # 张量tensor 随机初始化 x torch.rand(4,3) print(x) y torch.randn(4,3) print(y)# 初始化全零 张量 a torch.zeros((4,4),dtypetorch.long) print(a) #初始化全一 张量 b torch.ones(4,4) print(b) c tor…

【3D激光SLAM】LOAM源代码解析--laserMapping.cpp

系列文章目录 【3D激光SLAM】LOAM源代码解析–scanRegistration.cpp 【3D激光SLAM】LOAM源代码解析–laserOdometry.cpp 【3D激光SLAM】LOAM源代码解析–laserMapping.cpp 【3D激光SLAM】LOAM源代码解析–transformMaintenance.cpp 写在前面 本系列文章将对LOAM源代码进行讲解…

深层次分析字符数组和字符串的区别是什么?

前言 (1)休闲时刻刷B站,看到一个卖课的,发视频问,char arr1[]{‘H’,‘E’,‘L’,‘L’,‘O’};和char arr2[]“HELLO”;区别是什么。 (2)看那个卖课博主一顿分析,最后成功得出&…

ElasticSearch简介、安装、使用

一、什么是ElasticSearch? Elasticsearch 是 Elastic Stack 核心的分布式搜索和分析引擎。 Logstash 和 Beats 有助于收集、聚合和丰富您的数据并将其存储在 Elasticsearch 中。 Kibana 使您能够以交互方式探索、可视化和分享对数据的见解,并管理和监…

vue引入 import { decode } from ‘js-base64‘

vue引入 import { decode } from ‘js-base64’ package.json 里面加上 需要用的地方 加上 import { decode } from ‘js-base64’ let params decode(loook)最后 npm install

线性代数的学习和整理11: 子式与余子式

目录 1 原始矩阵A 2 子式(都是行列式) 2.1 k阶子式 2.2 k阶主子式 2.3 k阶顺序主子式 3 余子式 3.1 余子式 3.2 代数余子式 3.3 余子式作用是? 1 原始矩阵A 下面设计一个原始矩阵A,故意设计为A34, 行数≠列数 $$ \lef…

react import 引用失效 node_modules/@types/react/index.d.ts not a module.ts

问题描述 react ts的项目,正常使用vs code打开, 先运行 npm install 安装依赖过后 结果所有的react引用依旧标红,如下图所示: 点击红线 show problem(查看问题),提示node_modules/types/react/index.d.ts not a mod…

CCF HPC China2023 | 盛大开幕,邀您关注澎峰科技

2023年8月24日,以“算力互联智领未来”为主题的第十九届全国高性能计算学术年会(CCF HPC China 2023)在青岛红岛国际会议展览中心拉开帷幕。特邀嘉宾涵盖行业大咖,主持阵容同样是“重量级”——来自国家并行计算机工程技术研究中心…

SSL/TLS协议的概念、工作原理、作用以及注意事项

个人主页:insist--个人主页​​​​​​ 本文专栏:网络基础——带你走进网络世界 本专栏会持续更新网络基础知识,希望大家多多支持,让我们一起探索这个神奇而广阔的网络世界。 目录 一、SSL/TLS协议的基本概念 二、SSL/TLS的工作…

Git 版本控制系统

git相关代码 0、清屏幕:clear 1、查看版本号 git -v2、暂存、更改、提交 3、当前项目下暂存区中有哪些文件 git ls-files4、查看文件状态 git status -s5、暂时存储,可以临时恢复代码内容 git restore 目标文件 //(注意:完全…

LVS之keepalived

1、keepalived 概述 总结:Keepalived 软件就是通过VRRP协议来实现高可用功能。 应用场景:企业应用中,单台服务器承担应用存在单点故障的危险 单点故障一旦发生,企业服务将发生中断,造成极大的危害 VRRP通信原理&…

【C++进阶(一)】STL大法以及string的使用

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习C   🔝🔝 STL标准库 1. 前言2. STL库的版本以及缺陷3. ST…

SpringCloud学习笔记(一)_快速入门

SpringCloud简介 Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线)。分布式系统的协调导致了样板模式, 使用Spr…

RabbitMQ集群搭建和测试总结_亲测

RabbiMQ简介 RabbitMQ是用Erlang开发的,集群非常方便,因为Erlang天生就是一门分布式语言,但其本身并不支持负载均衡。 RabbitMQ模式 RabbitMQ模式大概分为以下三种: (1)单一模式。 (2)普通模式(默认的集群模式)。 (3)镜像模式(把需要的队列…