linux网络(3)—— socket编程(1)socket基础认识
欢迎来到博主的专栏:linux网络
博主ID:代码小豪
文章目录
- IP与端口号
- socket
- 字节序问题
IP与端口号
我们现在知道了,只要发送的报文的报头包含目的IP地址和源IP地址,就能通过通信设备,是两台主机进行远程通信,但是问题来了,当数据到达主机后,这个数据该如何使用?
比如现在小王的主机正在下载游戏,并且使用qq在和同学聊天,那么在小王的主机中就会存在两股数据流,分别是下载的数据流和qq的数据流,那么当数据流到达主机后,如何分辨哪些是给qq的,还是给下载游戏的呢?
首先在小王的主机中运行着两个进程,一个是下载器(WeGame或者steam),还有一个是qq,只要把数据流交给给进程处理,那么这两个数据流就相当于被正确的使用了。因此,在网络当中一定存在一个标识主机的进程的唯一标识码,这个标识码就叫做端口号。
端口号是一个16位的无符号整数,一个端口号可以标识一个进程,其中0~1023的端口号是固定的,用来标识如http,ssh,ftp等端口号。而1024~65535的端口号则用来标识用户的客户端程序,即进程。
因此在UDP和TCP协议的报头,会保存目的主机的IP地址和端口号这样就能保证数据准确的来到目的主机,以及目的主机中的正确的进程。
综上,IP 地址用来标识互联网中唯一的一台主机,port 用来标识该主机上唯一的一个网络进程,IP+Port 就能表示互联网中唯一的一个进程所以,通信的时候,本质是两个互联网进程进行通信,所以网络通信的本质,是进程间通信,只是这两个进程不在同一台主机当中。
socket
socket=IP地址+端口号。socket可以看做是一个接口,或者是一个对象,这个对象可以完成网络通信,其主要的成员是源IP地址+源端口号(发送数据的主机和进程),以及目的IP地址+目的端口号(接收数据的主机+进程)。
根据网络协议的不同,socket分为TCP socket和UDP socket,其两者的不同之处如下图:
1.TCP socket:基于TCP协议的socket,其提供可靠的,面相字节流的传输。
2.UDP socket:基于UDP协议的socket,其提供不可靠的,面相数据包的传输。
使用socket需要用上与socket相关的API,博主这里只展示,不讲解,在后续的博客中会结合实例讲解这些API。
// 创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器)
int socket(int domain, int type, int protocol);
// 绑定端口号 (TCP/UDP, 服务器)
int bind(int socket, const struct sockaddr *address,socklen t address len);
// 开始监听 socket (TCP, 服务器)
int listen(int socket, int backlog);
// 建立连接 (TCP, 客户端)
int connect(int sockfd, const struct sockaddr *addr,socklen t addrlen);
socketaddr分为三种,其代表socket对象的三种格式,分别是struct sockaddr,struct sockaddr_in,struct sockaddr_un。其代表三种形式的socket,分别是原始socket,网络通信的socket,本地通信的socket。由于这三种socket的使用场景不同,因此它们的结构也不相同。
那么在socket API当中,用来描述socket的类型通常都是struct sockaddr*,而我们在编程当中大多会使用struct sockaddr_in来进行网络通信的套接字,或者struct sockaddr_unix作为本地通信的套接字,因此需要通过类型强制转换,将上述的类型转换成struct sockaddr*。才能正确的使用socket API。
字节序问题
现在的主流的主机如x86,x64,采用的字节序都是小端字节序存储,但是世界上并非不存在大端字节序存储的主机,因此在网络通信方面。小端机器上的数据存储形式和大端机器上的数据存储形式可能是不同的。因此相同的二进制数据,需要进行大小端的转换,才能被主机正确的解码。
根据协议规定,在网络上的数据的字节序,一律采取大端的存储形式,因此如果是小端机器要将数据转发到网络,首先要将数据从小端转换为大端,然后如果接收数据的主机如果是小端,那么又要将网络当中的数据,从小端转换到大端。
但是我们发送数据的主机,可能是大端,也可能是小端,而接收数据的主机,也可能是大端,或者小端,因此在客户端/服务器的程序当中,直接强制规定将数据从小端转成大端,或者将小端转换成大端的方式并不明智,因为如果运行客户端的是大端,那么程序会失效,服务器也是同理。因此更为正确的做法是:将主机的存储方式(无论大小端),视为主机字节序,而网络的存储形式,视为网络字节序。当数据需要发送到网络时,无论是大小端的机器,都要进行将数据从主机字节序,转换成网络字节序,这里我们通常采用htois,htoil来完成。而数据从网络来到主机时,需要将网络字节序,转换成主机字节序,这个操作有ntohs,ntohl函数来完成。
这样做的好处是,无论是主机是大端小端,都要进行主机字节序转网络字节序这一步操作,如果是小端机器,那么就将数据从小端转成大端,如果是大端机器,那么就不对数据进行处理,反之接收网络的机器的处理方式也是同理,这样就能保证程序的网络通信部分,可以在大端,小端机器上都能正确运行。
相关文章:

linux网络(3)—— socket编程(1)socket基础认识
欢迎来到博主的专栏:linux网络 博主ID:代码小豪 文章目录 IP与端口号socket字节序问题 IP与端口号 我们现在知道了,只要发送的报文的报头包含目的IP地址和源IP地址,就能通过通信设备,是两台主机进行远程通信ÿ…...
【Kubernets】K8S内部nginx访问Service资源原理说明
文章目录 原理概述**一、核心概念****二、Nginx 访问 Service 的流程****1. Service 的作用****2. Endpoint 的作用****3. Nginx Pod 发起请求****(1) DNS 解析****(2) 流量到达 kube-proxy****(3) 后端 Pod 处理请求** **三、不同代理模式的工作原理****1. iptables 模式****2…...
使用Docker搭建Oracle Database 23ai Free并扩展MAX_STRING_SIZE的完整指南
使用Docker搭建Oracle Database 23ai Free并扩展MAX_STRING_SIZE的完整指南 前言环境准备目录创建启动Docker容器 数据库配置修改进入容器启动SQL*PlusPDB操作与字符串扩展设置配置验证 管理员用户创建注意事项总结 前言 本文将详细讲解在Docker环境中配置Oracle Database 23a…...

使用pytorch和opencv根据颜色相似性提取图像
需求:将下图中的花朵提取出来。 代码: import cv2 import torch import numpy as np import timedef get_similar_colors(image, color_list, threshold):# 将图像和颜色列表转换为torch张量device torch.device(cuda if torch.cuda.is_available() el…...
MySQL 8.X 报错处理
1.重新加载配置 reload the configuration mysql> ALTER INSTANCE RELOAD KEYRING; ERROR 1227 (42000): Access denied; you need (at least one of) the ENCRYPTION_KEY_ADMIN privilege(s) for this operation 提示需要ENCRYPTION_KEY_ADMIN权限 重新授权 GRANT ENCR…...

Ubuntu 22.04安装OpenJDK 17
步骤一:更新软件包 sudo apt update步骤二:安装openjdk-17 sudo apt install openjdk-17-jdk当系统要求输入密码时,请输入密码。然后键入 Y 并按 Enter 继续安装 步骤三:查看安装版本 java -version步骤四:查看安装…...
【时序预测】时间序列有哪些鲁棒的归一化方法
时间序列数据在金融、气象、医疗等领域中广泛存在,而股票数据作为典型的时间序列之一,具有非平稳性、噪声多、波动大等特点。为了更好地进行数据分析和建模,归一化是一个重要的预处理步骤。然而,由于时间序列数据的特殊性…...

nlp第九节——文本生成任务
一、seq2seq任务 特点:输入输出均为不定长的序列 自回归语言模型: 由前面一个字预测下一个字的任务 encoder-decoder结构: Encoder-Decoder结构是一种基于神经网络完成seq2seq任务的常用方案 Encoder将输入转化为向量或矩阵,其…...
STM32MP1xx的启动流程
https://wiki.st.com/stm32mpu/wiki/Boot_chain_overview 根据提供的知识库内容,以下是STM32 MPU启动链的详细解析: 1. 通用启动流程 STM32 MPU启动分为多阶段,逐步初始化外设和内存,并建立信任链: 1.1 ROM代码&…...
wgcloud-server端部署说明
Wgcloud 是一款开源的轻量级服务器监控系统,支持多平台,可对服务器的 CPU、内存、磁盘、网络等指标进行实时监控。 以下是 Wgcloud Server端的详细部署步骤: 环境准备 服务器: 至少准备两台服务器,一台作为监控端&a…...

大模型Agent:人工智能的崭新形态与未来愿景
在人工智能技术高歌猛进的当下,大模型 Agent 作为 AI 领域的关键研究方向,正日益彰显出其独有的魅力以及广阔无垠的应用前景。大模型 Agent 不但具备对环境的感知、自主的理解、决策的制定以及行动的执行能力,而且能够游刃有余地应对繁杂任务…...

专题二最大连续1的个数|||
1.题目 题目分析: 给一个数字k,可以把数组里的0改成1,但是只能改k次,然后该变得到的数组能找到最长的子串且都是1。 2.算法原理 这里不用真的把0变成1,因为改了比较麻烦,下次用就要改回成1,这…...
【ORACLE】ORACLE19C在19.13版本前的一个严重BUG-24761824
背景 最近在某客户的ORACLE开发环境(oracle 19.10)中,发现一个非常奇怪情况, 开发人员反馈,有一条SQL,查询了两个sum函数作为两个字段, select sum(c1),sum(c2) from ...当两个sum一起出现时,第一个sum的结果不对&am…...

2025国家护网HVV高频面试题总结来了03(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 0x1 高频面试题第一套 0x2 高频面试题第二套 0x3 高频面试题第三套 0x4高频面试题第四套 0x1 高频面试题…...

CentOS vs Ubuntu - 常用命令深度对比及最佳实践指南20250302
CentOS vs Ubuntu - 常用命令深度对比及最佳实践指南 引言 在 Linux 服务器操作系统领域,CentOS 和 Ubuntu 是广泛采用的发行版。它们在命令集、默认工具链及生态系统方面各有特点。本文深入剖析 CentOS 与 Ubuntu 在常用命令层面的异同,并结合实践案例…...

SQL命令详解之常用函数
目录 1 简介 2 字符串函数 2.1 字符串函数语法 2.2 字符串函数练习 3 数学函数 3.1 数学函数语法 3.2 数学函数练习 4 日期时间函数 4.1 日期时间函数语法 4.2 日期时间函数练习 5 条件函数 5.1 条件函数语法 5.2 条件函数练习 6 总结 1 简介 在SQL中我们经常会用…...

IndexError: index 0 is out of bounds for axis 1 with size 0
IndexError: index 0 is out of bounds for axis 1 with size 0 欢迎来到英杰社区,这里是博主英杰https://bbs.csdn.net/topics/617804998 报错原因 数组或数据结构为空 如果数组或 DataFrame 在指定的维度上没有任何元素(例如,没有列&#x…...

C++学习之C++初识、C++对C语言增强、对C语言扩展
一.C初识 1.C简介 2.第一个C程序 //#include <iostream> //iostream 相当于 C语言下的 stdio.h i - input 输入 o -output 输出 //using namespace std; //using 使用 namespace 命名空间 std 标准 ,理解为打开一个房间,房间里有我们所需…...
k8s面试题总结(八)
1.K8s部署服务的时候,pod一直处于pending状态,无法部署,说明可能的原因 Node节点的资源不足,yaml文件资源限制中分配的内存,cpu资源太大,node宿主机资源没那么大,导致无法部署。部署pod的yaml文…...
《今日-AI-编程-人工智能日报》
一、AI行业动态 荣耀发布“荣耀阿尔法战略” 荣耀在“2025世界移动通信大会”上宣布,将从智能手机制造商转型为全球领先的AI终端生态公司,并计划未来五年投入100亿美元建设AI设备生态。荣耀展示了基于GUI的个人移动AI智能体,并推出多款AI终端…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...

在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...
git: early EOF
macOS报错: Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...
DAY 26 函数专题1
函数定义与参数知识点回顾:1. 函数的定义2. 变量作用域:局部变量和全局变量3. 函数的参数类型:位置参数、默认参数、不定参数4. 传递参数的手段:关键词参数5 题目1:计算圆的面积 任务: 编写一…...