当前位置: 首页 > 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样式来定义各个部分的显示效果…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...