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

套接字的地址结构,IP地址转换函数,网络编程的接口

目录

一、套接字的地址结构

1.1 通用socket地址结构

1.2 专用socket地址结构

1.2.1 tcp协议族

1.2.3 IP协议族

二、IP地址转换函数

三、网络编程接口

3.1 socket()

3.2 bind()

3.3 listen()

3.4 accept()

3.5 connect()

3.6 close()

3.7 recv()、send()

3.8 recvfrom()、sento()


一、套接字的地址结构

我们前面所讨论的IPC机制都依靠一台计算机系统的共享资源实现,这里的资源可以是文件系统空间,共享的物理内存或者消息队列,但只有运行在同一台机器上的进程才能使用它们.

一台机器上的进程可以使用套接字和另外一台机器上的进程通信,这样就可以支持分布在网络中的客户/服务器系统.

同一台机器上的进程之间也可以使用套接字进行通信,

套接字的特性由3个属性确定,它们是:域(domain),类型(type)和协议(protocol).

套接字用地址作为它的名字,地址的格式随域(又被称为协议族,protocol family)的不同而不同,每个协议族又可以使用一个或多个地址族来定义地址格式,

1.1 通用socket地址结构

socket 网络编程接口中表示 socket 地址的是结构体 sockaddr,其定义如下:

#include <bits/socket.h>
struct sockaddr
{sa_family_t sa_family;//协议族char sa_data[14];//数据,没有给出IP地址,就是给了这么一块儿空间,起了一个占位的作用。
};

sa_familvy 成员是地址族类型(sa_family_t)的变量。地址族类型通常与协议族类型对应。常见的协议族和对应的地址族如下图所示:

1.2 专用socket地址结构

TCP/IP 协议族有 sockaddr_in 和 sockaddr_in6 两个专用 socket 地址结构体,它们分别用于 IPV4 和 IPV6:

  • sin_family:地址族 AF INET
  • sin_port:端口号,需要用网络字节序表示
  • sin_addr:IPV4 地址结构:s_addr 以网络字节序表示 IPV4 地址
struct in_addr
{u_int32_t s_addr;//无符号的32位的整型,存放IP地址;
};

1.2.1 tcp协议族

tcp协议族主要有三个:

  • 地址族
  • 端口号
  • IP地址
//tcp协议族
struct sockaddr_in
{sa_family_t sin_family;//地址族,就是sin_family:地址族 AF_INETu_int16_t sin_port;//端口,16位的端口struct in_addr sin_addr;//一个结构体,只有一个成员,是无符号的32位的整型,存放IP地址;(IPV4的地址就是32位)//其实后面还有占位的,只是我们不用它,所以就没有写
};

1.2.3 IP协议族

//IP协议族
struct in6_addr
{unsigned char sa_addr[16];// IPV6 地址,要用网络字节序表示
};struct sockaddr_in6
{sa_family_t sin6_family;//地址族:AF_INET6u_inet16_t sin6_port;// 端口号:用网络字节序表示u_int32_t sin6_flowinfo;// 流信息,应设置为 0struct in6_addr sin6_addr;// IPV6 地址结构体u_int32_t sin6_scope_id;// scope ID,尚处于试验阶段
};

二、IP地址转换函数

通常,人们习惯用点分十进制字符串表示 IPV4 地址,但编程中我们需要先把它们转化为整数方能使用,下面函数可用于点分十进制字符串表示的IPV4 地址和网络字节序整数表示的 IPV4 地址之间的转换

#include <arpa/inet.h>
in_addr_t inet_addr(const char *cp);//字符串表示的 IPV4 地址转化为网络字节序
char* inet_ntoa(struct in_addr in);// IPV4 地址的网络字节序转化为字符串表示

三、网络编程接口

头文件:

#include <sys/types.h>
#include <sys/socket.h>

3.1 socket()

socket()创建套接字,成功返回套接字的文件描述符,失败返回-1

int socket(int domain, int type, int protocol);
  • domain:设置套接字的协议族,AF_UNIX 、AF_INET、 AF_INET6
  • type:设置套接字的服务类型 SOCK_STREAM(流式服务)、SOCK_DGRAM(数据报服务)
  • protocol:一般设置为 0,表示使用默认协议
     

3.2 bind()

bind()将 sockfd 与一个 socket 地址绑定,成功返回 0,失败返回-1

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
  • sockfd 是网络套接字描述符,(命名套接字,就是上面的函数的返回值作为了我们的参数sockfd)
  • addr 是地址结构
  • addrlen 是 socket 地址的长度

3.3 listen()

listen()创建一个监听队列以存储待处理的客户连接,成功返回 0,失败返回-1

int listen(int sockfd,int backlog);
  • sockfd 是被监听的 socket 套接字
  • back1og 表示处于完全连接状态的 socket 的上限

3.4 accept()

accept()从 listen 监听队列中接收一个连接,成功返回一个新的连接 socket,该 socket 唯一地标识了被接收的这个连接,失败返回-1

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
  • sockfd 是执行过 listen 系统调用的监听 socket
  • addr 参数用来获取被接受连接的远端 socket 地址
  • addrlen 指定该 socket 地址的长度

3.5 connect()

客户端需要通过此系统调用来主动与服务器建立连接,成功返回 0,失败返回-1

int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);
  • sockfd 参数是由 socket()返回的一个 socket
  • serv_addr 是服务器监听的 socket 地址
  • addrlen 则指定这个地址的长度

3.6 close()

关闭一个连接,实际上就是关闭该连接对应的socket

int close(int sockfd);

3.7 recv()、send()

TCP 数据读写:

ssize_t recv(int sockfd, void *buff, size_t len, int flags);ssize_t send(int sockfd, const void *buff, size_t len, int flags);
  • recv()读取 sockfd 上的数据,buff 和 len 参数分别指定读缓冲区的位置和大小
  • send()往 socket 上写入数据, buff 和 len 参数分别指定写缓冲区的位置和数据长度
  • flags 参数为数据收发提供了额外的控制

3.8 recvfrom()、sento()

UDP 数据读写:

recvfrom()读取 sockfd 上的数据, buff 和 len 参数分别指定读缓冲区的位置和大小

ssize_t recvfrom(int sockfd, void *buff, size_t len, int flags.struct sockaddr* src_addr,socklen_t* addrlen);
  • src_addr 记录发送端的 socket 地址
  • addrlen 指定该地址的长度

sendto()往 socket 上写入数据, buff 和 len 参数分别指定写缓冲区的位置和数据长度

ssize_t sendto(int sockfd, void *buff, size_t len, int flags,struct sockaddr* dest_addr,socklen_t addrlen);
  • dest_addr 指定接收数据端的 socket 地址
  • addrlen 指定该地址的长度

相关文章:

套接字的地址结构,IP地址转换函数,网络编程的接口

目录 一、套接字的地址结构 1.1 通用socket地址结构 1.2 专用socket地址结构 1.2.1 tcp协议族 1.2.3 IP协议族 二、IP地址转换函数 三、网络编程接口 3.1 socket() 3.2 bind() 3.3 listen() 3.4 accept() 3.5 connect() 3.6 close() 3.7 recv()、send() 3.8 recv…...

Java回顾总结--RandomAccessFile和NIO

目录 一、RandomAccessFile1.1 为什么要有RandomAccessFile&#xff1f;1.2 常用方法简介1.3 RandomAccessFile 特点和优势1.3.1 既可以读也可以写1.3.2 可以指定位置读写 1.4 示例 二、NIONIO使用示例 一、RandomAccessFile 1.1 为什么要有RandomAccessFile&#xff1f; Ran…...

2024年3月第15届蓝桥杯青少组STEMA考试C++中高级真题试卷

第15届蓝桥杯青少组STEMA考试C中高级真题试卷&#xff08;2024年3月&#xff09; 题目总数&#xff1a;11 总分数&#xff1a;400 选择题 第 1 题 单选题 (110010)2(c3)16的结果是( )。 A. (240)10 B. (11110101)2 C. (366)8 D. (f6)16 第 2 题 单选题 …...

Hyperf AOP 和 注解

注解 (hyperf.wiki) AOP 面向切面编程 (hyperf.wiki) 切面 定义切面(Aspect) 根据官方教程定义一个切面。可以指定类、方法、参数和注解上生效。 <?php namespace App\Aspect;use App\Service\SomeClass; use App\Annotation\SomeAnnotation; use Hyperf\Di\Annotatio…...

【C++】string类(介绍、常用接口)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;http://t.csdnimg.cn/eCa5z 目录 string类的常用接口说明 string类对象的常见构造 ​编辑 string字符串的遍历&#xff08;迭代器&#xf…...

SpringBoot项目中同时支持https和http协议

实用干货&#xff01;看壹哥如何在SpringBoot项目中同时支持https和http协议_springboot http htpps共存-CSDN博客...

三大排序:冒泡、选择、插入

冒泡排序&#xff1a; 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法。它通过比较相邻元素的大小&#xff0c;并交换它们的位置&#xff0c;使较大&#xff08;或较小&#xff09;的元素逐渐“浮”到数组的一端&#xff0c;从而实现排序的目的。 下面是冒…...

Android中MultiDex优化

MultiDex基本思路 当一个Dex文件太肥的时候(方法数目太多、文件太大)&#xff0c;在打包或在安装或运行apk也会出问题。 解决方法就是将这个硕大的Dex文件拆分成若干个小的Dex文件。 刚好一个ClassLoader可以有多个DexFile。 MultiDex主要性能瓶颈 解压缩和Dex优化&#xff08;…...

MySQL 8.0 的执行计划(EXPLAIN)

MySQL 8.0 的执行计划&#xff08;也称为“EXPLAIN”计划&#xff09;是数据库优化器为 SQL 查询生成的步骤序列。解读执行计划可以帮助数据库管理员&#xff08;DBA&#xff09;和开发者理解查询如何执行&#xff0c;识别潜在的性能问题&#xff0c;并据此优化查询。 下面是如…...

leetcode——二叉树问题汇总

leetcode 144. 二叉树的前序遍历 ①递归法&#xff1a; /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val,…...

Android基础开发-饿汉式申请权限

1、案例&#xff0c;打开app时&#xff0c;就要申请权限 直接在onCreateView中申请所有权限就可&#xff0c;然后在选择的回调里边判断申请的结果 package com.example.client;import android.Manifest; import android.content.Intent; import android.content.pm.PackageMa…...

java Day7 正则表达式|异常

文章目录 1、正则表达式1.1 常用1.2 字符串匹配&#xff0c;提取&#xff0c;分割 2、异常2.1 运行时异常2.2 编译时异常2.3 自定义异常2.3.1 自定义编译时异常2.3.2 自定义运行时异常 1、正则表达式 就是由一些特定的字符组成&#xff0c;完成一个特定的规则 可以用来校验数据…...

Python算法题集_搜索二维矩阵

Python算法题集_搜索二维矩阵 题74&#xff1a;搜索二维矩阵1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【矩阵展开为列表二分法】2) 改进版一【行*列区间二分法】3) 改进版二【第三方模块】 4. 最优算法5. 相关资源 本文为Python算法题集之…...

学习笔记:顺序表和链表(一、顺序表)

首先来个导言&#xff1a; 1.数组的优势&#xff1a;下标的随机访问&#xff0c;物理空间连续。数组指针用[ ]或者 * , 结构体指针用 - > 2.书写习惯 test.c写出主体框架 QelList.c写出结构体、头文件、函数声明 QelList.c写出函数的实现 3.挪动&#xff1a;如果从前…...

Midjourney从入门到实战:图像生成命令及参数详解

目录 0 专栏介绍1 Midjourney Bot常用命令2 Midjourney绘图指令格式3 Midjourney绘图指令参数3.1 模型及版本3.2 画面比例3.3 风格化3.4 图片质量3.5 混乱值3.6 随机数种子3.7 重复贴图3.8 停止3.8 垫图权重3.9 提示词权重分割 0 专栏介绍 &#x1f525;Midjourney是目前主流的…...

C语言分析基础排序算法——插入排序

目录 插入排序 直接插入排序 希尔排序 希尔排序基本思路解析 希尔排序优化思路解析 完整希尔排序文件 插入排序 直接插入排序 所谓直接插入排序&#xff0c;即每插入一个数据和之前的数据进行大小比较&#xff0c;如果较大放置在后面&#xff0c;较小放置在前面&#x…...

海格里斯HEGERLS智能托盘四向车系统为物流仓储自动化升级提供新答案

随着实体企业面临需求多样化、订单履行实时化、商业模式加速迭代等挑战&#xff0c;客户对物流仓储解决方案的需求也逐渐趋向于柔性化、智能化。作为近十年来发展起来的新型智能仓储设备&#xff0c;四向车系统正是弥补了先前托盘搬运领域柔性解决方案的空白。随着小车本体设计…...

SQLiteC/C++接口详细介绍-sqlite3类(一)

上一篇&#xff1a;SQLiteC/C接口简介 下一篇&#xff1a;SQLiteC/C接口详细介绍&#xff08;二&#xff09; 引言&#xff1a; SQLite C/C 数据库接口是一个流行的SQLite库使用形式&#xff0c;它允许开发者在C和C代码中嵌入 SQLite 基本功能的解决方案。通过 SQLite C/C 数据…...

基于UDP实现直播间聊天的功能

需求&#xff1a;软件划分为用户客户端和主播服务端两个软件client.c和server.c 用户客户端负责&#xff1a;1.接收用户的昵称2.接收用户输入的信息&#xff0c;能够将信息发送给服务端3.接收服务端回复的数据信息,并完成显示主播服务端负责&#xff1a;1.对所有加入直播间的用…...

html5cssjs代码 006 文章排版《桃花源记》

html5&css&js代码 006 文章排版《桃花源记》 一、代码二、解释页面整体结构&#xff1a;头部信息&#xff1a;CSS样式&#xff1a;文章内容&#xff1a; 这段代码定义了一个网页&#xff0c;用于展示文章《桃花源记》的内容。网页使用了CSS样式来定义各个部分的显示效果…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...