[Linux] 网络编程套接字

news2024/11/15 21:40:31

目录

预备知识

网络字节序

 网络字节序和主机字节序转换的库函数

socket编程接口

socket常见API

sockaddr结构

套接字的种类

预备知识

1.在IP数据包头部中,有两个IP地址,分别叫做源IP地址和目的IP地址。

2.端口号:是传输层协议的内容     

  •         端口号是一个2字节16位的整数。
  •         端口号用来标识一个进程,告诉操作系统,当前的这个数据要交给哪个进程处理。
  •         IP地址能够唯一标识一台主机,端口号能够标识该主机上的唯一一个进程,因此IP地址 + 端口号能够标识网络上的某一台主机的某一个进程。
  •         一个端口号只能被一个进程占用。

问: 进程ID即PID表示唯一一个进程,此处的端口号也表示唯一一个进程,为什么还要有端口号的存在?

        从技术角度上,pid可以取代端口号,但是不是所有的进程都要网络通信,但所有进程必须要有pid,端口号的出现实现了系统和网络功能的解耦。

PS:一个进程可以绑定多个端口号,但是一个端口号不能被多个进程绑定,因为要通过端口号找到唯一一个进程。

3.传输层协议(UDP和TCP)的数据段中有两个端口号,分别叫做源端口号和目的端口号,就是在描述“数据是谁发的,发给谁的”。

网络字节序

        内存中的多字节数据相对于内存地址有大端和小端之分,磁盘文件中的多字节数据相对于文件中的便宜地址也有大端小端之分,网络数据流同样有大小端之分。

发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出。

接受主机把从网络上收到的字节依次保存在接受缓冲区,也是按内存地址从低到高的顺序保存。

网络数据流的地址应该这样规定:先发出的数据是低地址,后发出的数据是高地址。

TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节。

因此,不管这台主机是大端机还是小端机,都会按照这个TCP/IP规定的网络字节序来发送和 接收数据

 网络字节序和主机字节序转换的库函数

#include <arpa/inet.h>

//主机字节序转网络字节序

uint32_t  htonl (uint32_t hostlong);

uint16_t  htons (uint16_t hostshort);

//网络字节序转主机字节序

uint32_t  ntohl (uint32_t netlong);

uint16_t  ntohl (uint16_t netshort);

socket编程接口

socket常见API

//创建 socket 文件描述符 (TCP / UDP , 客户端 + 服务器)

int socket (int domain, int type, int protocol);

//绑定端口 (TCP /  UDP ,服务器)

int bind (int socket, cosnt struct sockaddr* address, scoklen_t address_len);

//开始监听socket (TCP, 服务器)

int  listen(int socket, int backlog);

//接收请求 (TCP, 服务器)

int accept (int scoket, struct sockaddr* address,socklen_t address_len);

//建立连接(TCP,客户端)

int connect (int sockfd, cosnt struct sockaddr* addr, scoklen_t address_len) ;

sockaddr结构

socket API 是一层抽象的网络编程接口,适用于各种底层网络协议,如 IPv4, IPv6,UNIX Domain Socket, 然而各种网络协议的地址格式并不相同。

套接字的种类

下述三个结构分别为原始套接字、网络套接字、域间套接字

  • IPv4, IPv6的地址格式定义在<netinet/in.h>中,IPv4地址用 sockaddr_in结构体表示,包括16位地址类型,16位端口号和32位IP地址。
  • IPv4, IPv6地址类型分别定义为常数 AF_INET、AF_INET6 ,这样只要取到某种sockaddr结构体的首地址,不需要知道具体是哪种类型的sockaddr结构体,就可以根据地址类型字段确定结构体中的内容。
  • socket API可以都用struct sockaddr *类型表示, 在使用的时候需要强制转化成sockaddr_in; 这样的好处是程序的通用性。
sockaddr结构

struct sockaddr

  {

            __SOCKADDR_COMMON (sa_);  /* Common data: address family and length.  */

            char sa_data[14];   /* Address data.  */

  };

sockaddr_in结构

struct sockaddr_in

  {

    __SOCKADDR_COMMON (sin_);         /*包含地址类型*/

    in_port_t sin_port;                                  /* 端口号 */

    struct in_addr sin_addr;                         /* IP地址  */

    /* Pad to size of `struct sockaddr'.  */

    unsigned char sin_zero[sizeof (struct sockaddr) -

         __SOCKADDR_COMMON_SIZE -

         sizeof (in_port_t) -

         sizeof (struct in_addr)];

  };

in_addr结构 

typedef uint32_t in_addr_t;

struct in_addr

{

    in_addr_t s_addr;  /* in_addr 用来表示一个IPv4的IP地址,其实就是一个32位整数 */

};

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

速过计算机二级python——第八讲:基本编程

第八讲:基本编程 基本编程题【15 分】简单应用题【25 分】综合应用题【20 分】**问题一**【5分】问题二【5 分】问题二【10 分】小结基本编程题【15 分】 考生文件夹下存在一个文件 PY101.py,请写代码替换横线,不修改其他代码,实现以下功能:【5 分】键盘输入正整数 n,按要…

EMNLP 2023精选:Text-to-SQL任务的前沿进展(上篇)——正会论文解读

导语 本文记录了今年的自然语言处理国际顶级会议EMNLP 2023中接收的所有与Text-to-SQL相关&#xff08;通过搜索标题关键词查找得到&#xff0c;可能不全&#xff09;的论文&#xff0c;共计12篇&#xff0c;包含5篇正会论文和7篇Findings论文&#xff0c;以下是对这些论文的略…

国图公考:公务员面试资格复审需要准备什么?

参加国考面试的考生在资格审核阶段需要准备以下材料&#xff1a; 1、本人身份证、学生证或工作证复印件。 2、公共科目笔试准考证复印件。 3、考试报名登记表。 4、本(专)科、研究生各阶段学历、学位证书(应届毕业生没有可以暂时不提供)。 5、报名资料上填写的各类证书材料…

Debezium发布历史103

原文地址&#xff1a; https://debezium.io/blog/2021/03/18/understanding-non-key-joins-with-quarkus-extension-for-kafka-streams/ 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. 了解 Kafka Streams 的 Q…

文心一言用户规模破亿 /微软宣布:支付费用延长旧版Windows 10使用寿命|魔法半周报

我有魔法✨为你劈开信息大海❗ 高效获取AIGC的热门事件&#x1f525;&#xff0c;更新AIGC的最新动态&#xff0c;生成相应的魔法简报&#xff0c;节省阅读时间&#x1f47b; &#x1f525;资讯预览 百度大模型重要突破&#xff0c;文心一言用户规模破亿&#xff0c;飞桨开发者…

LeetCode、198. 打家劫舍【中等,一维线性DP】

文章目录 前言LeetCode、198. 打家劫舍【中等&#xff0c;一维线性DP】题目及分类思路线性DP&#xff08;一维&#xff09; 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注…

Netty源码 之 bind绑定流程

1.Netty框架总览 Netty是一个基于NIO异步通信框架 Netty框架是由许多组件&#xff0c;优化的数据结构所构建成。 正是通过灵活的组件构建&#xff0c;优化后的数据结构&#xff0c;进而才能保证Netty框架面对高并发场景具有一定的能力 1.1 Netty相关组件 Netty重要的组件有…

SpringBoot中使用Spring自带线程池ThreadPoolTaskExecutor与Java8CompletableFuture实现异步任务示例

场景 关于线程池的使用&#xff1a; Java中ExecutorService线程池的使用(Runnable和Callable多线程实现)&#xff1a; Java中ExecutorService线程池的使用(Runnable和Callable多线程实现)_executorservice executorservice executors.newfix-CSDN博客 Java中创建线程的方式…

Unity_ShaderGraph节点问题

Unity_ShaderGraph节点问题 Unity版本&#xff1a;Unity2023.1.19 为什么在Unity2023.1.19的Shader Graph中找不见PBR Master节点&#xff1f; 以下这个PBR Maste从何而来&#xff1f;

Arthas使用教程—— 阿里开源线上监控诊断产品

文章目录 1 简介2背景3 图形界面工具 arthas 阿里开源3.1 &#xff1a;启动 arthas3.2 help :查看arthas所有命令3.3 查看 dashboard3.4 thread 列出当前进程所有线程占用CPU和内存情况3.5 jvm 查看该进程的各项参数 &#xff08;类比 jinfo&#xff09;3.6 通过 jad 来反编译 …

【Chrono Engine学习总结】1-安装配置与程序运行

本文仅用于个人安装记录。 官方安装教程 https://api.projectchrono.org/8.0.0/tutorial_install_chrono.html Windows下安装 windows下安装就按照教程好了。采用cmake-gui进行配置&#xff0c;建议首次安装只安装核心模块。然后依此configure下irrlicht&#xff0c;sensor…

JVM 性能调优 - 参数调优(3)

查看 JVM 内存的占用情况 编写代码 package com.test;public class PrintMemoryDemo {public static void main(String[] args) {// 堆内存总量long totalMemory Runtime.getRuntime().totalMemory();// jvm 试图使用的最大堆内存long maxMemory Runtime.getRuntime().maxM…

国内游戏服务器价格表

游戏服务器租用多少钱一年&#xff1f;1个月游戏服务器费用多少&#xff1f;阿里云游戏服务器26元1个月、腾讯云游戏服务器32元&#xff0c;游戏服务器配置从4核16G、4核32G、8核32G、16核64G等配置可选&#xff0c;可以选择轻量应用服务器和云服务器&#xff0c;阿腾云atengyu…

PHP客服系统-vue客服聊天系统

PHP-Vue客服聊天系统是一款高效、灵活的客户服务解决方案&#xff0c;基于ThinkPHP6、Vue3和Workerman(Gateworker)框架开发&#xff0c;专为单商户场景打造。 系统亮点&#xff1a; 分布式部署支持&#xff0c;轻松应对高并发场景&#xff1b;本地消息存储功能&#xff0c;确…

Python 数据分析(PYDA)第三版(四)

原文&#xff1a;wesmckinney.com/book/ 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 八、数据整理&#xff1a;连接、合并和重塑 原文&#xff1a;wesmckinney.com/book/data-wrangling 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 此开放访问网络版本的…

STM32F1 - 点灯-寄存器模式

点灯 实验概述&#xff1a;Step1> 建立工程Step2> 宏定义 - 寄存器地址 实验概述&#xff1a; 用配置寄存器的方式&#xff0c;开关一个LED灯&#xff0c; 只用标准库中提供的启动文件&#xff0c; Step1> 建立工程 出现错误&#xff1a;导入文件类型错误 keil5编译中…

QMUI_Android:提升Android开发效率与质量的利器

QMUI_Android&#xff1a;提升Android开发效率与质量的利器 在Android应用开发过程中&#xff0c;开发者常常面临着重复编写基础组件和处理兼容性问题的挑战&#xff0c;这不仅耗费时间&#xff0c;也降低了开发效率。为了解决这一问题&#xff0c;Tencent推出了QMUI_Android框…

如何使用Python + 百度翻译API 自动大批量免费翻译Excel文件中的外语内容

手里有一个Excel文件,包括了大量的亚马逊德语搜索词(关键词),每个单元格1个,需要翻译为中文。但是文件大小超过了10M,不能使用百度或Google免费的文档功能,如果手工一个个的翻译然后粘贴又太麻烦,于是想到用Python加免费翻译API完成。 一、openpyxl库 用Python编辑处…

【数据结构】排序之冒泡排序和快速排序

简单不先于复杂&#xff0c;而是在复杂之后。 文章目录 1. 交换排序1.1 冒泡排序1.2 快速排序1.3 快速排序优化1.4 快速排序非递归 1. 交换排序 基本思想&#xff1a;所谓交换&#xff0c;就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置&#xff0c;交换…

day44_jdbc

今日内容 0 复习昨日 1 讲作业 2 数据库连接池(druid) 3 反射 4 改造DBUtil 5 完成CRUD练习 0 复习昨日 1 sql注入 2 预处理语句 3 事务操作 4 DBUtil 1 作业【重要】 利用ORM完成,以下的几个方法非常重要,将来写项目就是这些操作 写项目步骤 搭建环境 创建项目导入依赖工具类数…