当前位置: 首页 > news >正文

Linux网络编程的套接字分析(其一,基本知识)

文章目录

  • 套接字的类型
    • 流套接字
    • 数据报套接字
    • 原始套接字
  • 套接字地址
    • 获取套接字地址
  • 协议族和地址族

套接字的类型

Linux系统的套接字有三类:流套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAM)。

流套接字

用于面向连接的、可靠的数据传输服务。该服务将保证数据能够实现无差别、无重复发送,并按顺序接收。流套接字用于TCP协议。

数据报套接字

提供一种无连接的服务。该服务并不能保证数据的可靠性,数据在传输过程中可能会丢失或重复,且无法保证顺序地接收到数据。一般用于UDP协议,如果要为传输增加可靠性,可以在程序中实现,例如使用kcp协议去封装udp协议。

原始套接字

允许对较低层次的协议直接访问,比如IP、ICMP,它常用于检验新的协议实现,或者访问现有服务中配置的新设备,因为原始套接字可以自如地控制Linux下的多种协议,能够对底层的传输机制进行控制,所以可以应用原始套接字来操控网络层合传输层应用。比如:接收发送发向本机的ICMP、IGMP协议包,或者接收TCP/IP栈不能够处理的IP包,也可以用来发送一些自定义报头或者自定义协议的IP包。网络监听技术经常会用到原始套接字。

总:原始套接字合标准套接字(前两个)的区别在:原始套接字可以读写内核没有处理的IP数据报,而流套接字只能读取TCP的数据,数据报套接字只能读取UDP的数据。

套接字地址

一个套接字嗲表通信的一端,每端都有一个套接字地址,这个socket地址包含了ip地址和端口等信息。有了ip地址便可以区分主机,有了端口号,便可以区分主机上的进程。套接字地址一般分为 通用套接字地址 和 专用套接字地址。
通用socket地址: sockaddr
专用套接字地址:sockaddr_in 和 sockaddr_in6 (分别是IP4和IP6)

获取套接字地址

获取本地套机字地址:getsockname
获取远程套接字地址:getpeername

#incudle <sys/socket.h>
int getsockname(int sockfd, struct sockaddr* localaddr, socklen_t addrlen);
int getpeername(int sockfd, struct sockaddr* peeraddr, socklen_t addrlen);
参数: 套接字描述符, 通用套接字地址结构体(用来存放结果的), 
通用套接字地址结构体的长度,需要使用sizeof(struct sockaddr_in)初始化赋值

例子:获取绑定前后的套接字地址

#include <cstdio>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <errno.h>#define PORT 10051
#define SER_IP "192.168.159.129"int main(){int sfp;struct sockaddr_in serv = {0};serv.sin_port = htons(PORT);serv.sin_addr.s_addr = inet_addr(SER_IP);serv-sin_family = AF_INET;struct sockaddr_in result = {0};char on = 1;int res_len = sizeof(struct sockaddr_in);int err;sfp = socket(AF_INET, SOCK_STREAM, 0);if( -1 == sfp){printf("socket fail\n");return -1;}printf("socket ok\n");//打印bind前的socket地址printf("ip = %s, port = %d\n", inet_ntoa(result.sin_addr), ntohs(result.sin_port));//允许地址立即复用setsockopt(sfp, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));//打印绑定后的本地套接字地址if( -1 == bind(sfp, (struct sockaddr*)(&serv), sizeof(struct sockaddr)) ){prinf("bind fail:%d\n");return -1;}printf("bind ok\n");getsockname(sfp, (struct sockaddr*)&result, (socklen_t*)&res_len)); printf("ip = %s, port = %d\n", inet_ntoa(result.sin_addr), ntohs(result.sin_port));return 0;
}

协议族和地址族

理论上建立socket时,如果是指定协议的,应该使用PF_xxxx,如:PF_INET;如果是指定地址的,应该使用AF_xxxx,如:AF_INET。当然,两者的值是相同的,混用也问题不大。

在Ubuntu20.04下,/usr/include/x86_64-linux-gnu/bits/socket.h中定义了地址族和协议族。

相关文章:

Linux网络编程的套接字分析(其一,基本知识)

文章目录 套接字的类型流套接字数据报套接字原始套接字 套接字地址获取套接字地址 协议族和地址族 套接字的类型 Linux系统的套接字有三类&#xff1a;流套接字(SOCK_STREAM)&#xff0c;数据报套接字(SOCK_DGRAM)&#xff0c;原始套接字(SOCK_RAM)。 流套接字 用于面向连接…...

后端Web开发之Maven

1.java项目构建工具maven介绍 Maven是apache旗下的一个开源项目。Apache软件基金会&#xff0c;成立于1999年7月&#xff0c;是目前世界上最大的最受欢迎的开源&#xff08;源代码开放&#xff09;软件基金会也是一一个专门为支持开源项目而生的非盈利性组织。 apache开源项目…...

前端创新实践:用JavaScript打造网页扫码新体验

引言 简述扫码技术在现代网页应用中的普及和重要性。引入JavaScript实现网页扫码功能的创新性和实用性。 扫码技术概述 介绍扫码技术的原理和在不同平台&#xff08;如微信、支付宝&#xff09;的应用。讨论扫码技术对用户体验和业务流程的影响。 JavaScript实现网页扫码的…...

AWS CLI命令行

参考文档&#xff1a;在 macOS 上安裝&#xff0c;更新和卸載 AWS CLI 版本 1 - AWS Command Line Interface...

领导力培养的底层逻辑

领导力就是从人们从他们现在的地方&#xff0c;到他们从未去过的地方的能力--基辛格 ## 1. 领导力的一些观点 ## 2. 五种习惯十大承诺 ## 3. 需要领导的场景 ## 4.0 组织中谁需要领导力 ## 5.0 领导力培养 领导力培养的底层逻辑可以简单描述为以下几个方面&#xff1a; 管理…...

【MATLAB第107期】基于MATLAB的Morris局部敏感性分析模型(无目标函数)

【MATLAB第107期】基于MATLAB的Morris局部敏感性分析模型&#xff08;无目标函数&#xff09; 更正&#xff1a; 局部敏感性分析方法 一、原理介绍 1.基本原理&#xff1a; Morris方法采用概率均匀抽样的方式估计每个模型输入因子在输出结果中的重要性&#xff0c;通过比较系…...

Tomcat搭建JSPServlet

一、Tomcat环境搭建 1. 将项目变为Web项目 选中项目&#xff0c;点击Help中的Find Action 搜索Add Framework Support 勾选Web Application 出现这些文件就是成功了 2. 配置Tomcat 点击Edit Configurations 点击加号&#xff0c;选择Tomcat Server Local Deployment栏下点击…...

32位定点数和32/64位浮点数的二进制生成方法

问题由来 定点数和浮点数在嵌入式软件处理和FPGA算法方面使用比较普遍&#xff0c;但是遇到FPGA实现32位定点数的处理&#xff0c;想要仿真时&#xff0c;突然发现全网都在讲浮点数和定点数的格式和理论&#xff0c;几乎没有生成的快捷方法&#xff0c;好在一片文章出现了一点…...

STM32利用arm-dsp库进行FIR低通滤波【详细】

arm-dsp库官方已经封装好了&#xff0c;使用的时候需要把dsp库移植到工程里面&#xff0c;具体怎么移植网上可以找到教程 这里直接说怎么用FIR的流程&#xff1a; 一、Matlab里面生成所配置的阶数和系数 1、在Matlab命令窗口输入fdatool,回车&#xff0c;会弹出一个新窗口 2…...

Efficient-KAN 源码详解

Efficient-KAN源码链接 Efficient-KAN (GitHub) 改进细节 1.内存效率提升 KAN网络的原始实现的性能问题主要在于它需要扩展所有中间变量以执行不同的激活函数。对于具有in_features个输入和out_features个输出的层,原始实现需要将输入扩展为shape为(batch_size, out_featur…...

Jlink commander使用方法(附指令大全)

Jlinkcmd它可以方便用户在非仿真的情况下&#xff0c;hold内核、单步、全速、设置断点、查看内核和外设寄存器、读取flash代码等等&#xff0c;方便大家拥有最高的权限查看在运行中的MCU情况&#xff0c;查找非IDE仿真情况下&#xff0c;MCU运行异常的原因。 目录 驱动安装 …...

Java SpringBoot实现PDF转图片

不是单页图片&#xff0c;是多页PDF转成一张图片的逻辑。 我这里的场景是PDF转成图片之后返回给前端&#xff0c;前端再在图片上实现签字&#xff0c;并且可拖拽的逻辑&#xff0c;就是签订合同的场景。 但是这里只写后端多页PDF转图片的逻辑。 先说逻辑&#xff0c;后面直接…...

elasticsearch SQL:在Elasticsearch中启用和使用SQL功能

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…...

Java 并发编程:线程变量 ThreadLocal

大家好&#xff0c;我是栗筝i&#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 029 篇文章&#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验&#xff0c;并希望进…...

【OpenHarmony4.1 之 U-Boot 2024.07源码深度解析】018 - init_sequence_f 各函数源码分析(二)

【OpenHarmony4.1 之 U-Boot 2024.07源码深度解析】018 - init_sequence_f 各函数源码分析(二) 一、arch_cpu_init二、arch_cpu_init系列文章汇总:《【OpenHarmony4.1 之 U-Boot 源码深度解析】000 - 文章链接汇总》 本文链接:《【OpenHarmony4.1 之 U-Boot 2024.07源码深度…...

LVS原理——详细介绍

目录 介绍 lvs简介 LVS作用 LVS 的优势与不足 LVS概念与相关术语 LVS的3种工作模式 LVS调度算法 LVS-dr模式 LVS-tun模式 ipvsadm工具使用 实验 nat模式集群部署 实验环境 webserver1配置 webserver2配置 lvs配置 dr模式集群部署 实验环境 router 效果呈现…...

MYSQL 5.7.36 等保 建设记录

文章目录 前言一、开启审计日志1.1 查看当前状态1.2 开启方式1.3 查看开启后状态 二、密码有效期2.1 查看当前状态2.2 开启方式2.3 查看开启后状态 三、密码复杂度3.1 查看当前状态3.2 开启方式3.3 查看开启后状态 四、连接控制4.1 查看当前状态4.2 开启方式4.3 查看开启后状态…...

fatal: unable to access ‘https://github.com/xxxxx

ubuntu中git克隆项目异常 git clone https://github.com/xxx Cloning into ‘xxx’… fatal: unable to access ‘https://github.com/xxx/xx.git/’: Could not resolve host: github.com 解决办法使用命令&#xff1a; git config --global http.proxy git config --global…...

从零开始的CPP(38)——递归与动态规划

leetcode46 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2&#xff1a; 输入&#…...

从战略到系统架构:信息系统设计的全面解析

在当今数字化时代&#xff0c;信息系统已成为企业运营、管理和创新的核心驱动力。信息系统设计的重要性不仅关乎企业的技术实现&#xff0c;更直接影响到企业的战略执行和市场竞争能力。本文将从战略视角出发&#xff0c;深入探讨信息系统设计的全过程&#xff0c;包括从战略制…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...