【Linux】网络编程套接字

news2024/7/6 18:02:28

1 预备知识

1.1 IP地址

  • IP协议有两个版本,分别是IPv4和IPv6。没有特殊说明,默认都是IPv4
  • 对于IPv4,IP地址是一个四个字节32为的整数;对于IPv6来说,IP地址是128位的整数
  • 我们通常也使用 “点分十进制” 的字符串表示IP地址,例如 180.101.50.172,用点分割的每一个数字表示一个字节,范围是 [0, 255] 。

  • 公网IP:通常用来唯一地表示互联网中唯一的主机。

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

  • 源 IP 和目的 IP:对一个报文来讲,回答了从哪里来到哪里去的问题,最大的意义是指导一个报文该如何进行路径选择。

1.2 端口号

  • 端口号(port)是传输层协议的内容。它是一个 2 字节 16 位的整数,用来唯一标识一台主机上的一个进程。

 

进程具有独立性,进程间通信的前提工作:先得让不同的进程看到同一份资源,这份资源在这里就是网络

源端口号和目的端口号:描述数据是哪个进程发的,要发给哪个进程。

一个进程可以关联多个端口号,但是一个端口号不可以关联多个进程,这个可以由端口号的概念得出。

1.3 TCP协议和UDP协议

我们需要先对 TCP 协议和 UDP 协议有一个直观的认识,后面再详细讨论。

  • TCP(Transmission Control Protocol,传输控制协议)
    • 传输层协议。
    • 有连接。
    • 可靠传输。
    • 面向字节流
  • UDP(User Datagram Protocol,用户数据报协议)
    • 传输层协议。
    • 无连接。
    • 不可靠传输。
    • 面向数据报

说明:

  • TCP 的可靠和 UDP 的不可靠都是中性词,客观的,没有谁好谁不好,只有谁更合适。
  • 字节流:以字节为单位进行数据获取,可以根据需求进行数据量的获取,得到的数据需要自己解析才能得到相应的数据报。
  • 数据报:以数据报为单位进行获取的,要么无法获取,要么获取到的数据就是一个完整的数据报,不需要上层的解析。

1.4 网络字节序

我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分,磁盘文件中的多字节数据相对于文件中的偏移地址也有大端和小端之分。网络数据流同样有大端和小端之分,那么为了避免网络通信中不同主机大小端不一致的问题,应如何定义网络数据流的地址呢?

  1. 发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出。
  2. 接收主机把从网络上接收到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存。
  3. 因此,网络数据流的地址应该这样规定:先发出的数据是低地址,后发出的数据是高地址。
  4. TCP/IP 协议规定,网络数据流应采用大端字节序,即低地址高字节。
  5. 不管这台主机是大端机还是小端机,都会按照这个 TCP/IP 规定的网络字节序来发送/接收数据。如果当前发送主机是小端机,就需要先将数据转成大端,否则就忽略,直接发送即可。
     

 

为了使网络程序具有可移植性,使同样的 C 代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机字节序的转换:

注:这些函数名很好记,h 表示 host ,n 表示 network ,l 表示 32 位长整数,s 表示 16 位短整数。

举个例子:htonl函数表示将 32 位的长整数从主机字节序转换为网络字节序。

2 socket 编程接口

2.0  socket 常见 API

网络通信的标准方式有很多种,比如基于 IP 的网络通信(它对应的通信协议家族是 AF_INET,网络套接字),还有原始套接字、域间套接字。有很多种类的套接字,其实就是编程接口。这几种编程接口都是各自不同的体系,于是就会有不同套的编程接口,这样就会很麻烦,因此,干脆把不同套的编程接口统一为同一套编程接口,也就是下面的这一套。换言之,要使用不同种类的通信方式,只需要改变传入的参数即可。

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

// 绑定端口号 (服务器, TCP/UDP)
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

// 设置socket文件状态为监听状态 (服务器, TCP)
int listen(int sockfd, int backlog);

// 接受连接 (服务器, TCP)
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

// 发起连接 (客户端, TCP)
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

 于是,为了支持不同种类的通信方式,struct sockaddr的结构就被设计出来了,它是一种通用结构。

在这里插入图片描述 

 struct sockaddr_in是用来网络的之间的进程通信,struct sockaddr_un是用来本地的进程间通信的。

socket API 的参数都用struct sockaddr *类型表示,在使用时传入各种类型的struct sockaddr指针,强转成struct sockaddr *即可。

这样,API 内部只要取得某种struct sockaddr的首地址,不需要知道具体类型,就可以根据地址类型字段确定结构体中的内容。这就相当于面向对象中的多态特性!

 

2.1 socket 系统调用

socket的作用:为网络通信创建一个 socket 文件

socket的参数:
 ① domain:指定协议家族。我们选择 AF_INET 。
 ② type:指定套接字类型。对于 TCP SOCK_STREAM ,应选择 ;对于 UDP ,应选择 SOCK_DGRAM 。
 ③ protocol:指定协议类型。在 TCP 和 UDP 中,我们设为 0 即可。

socket的返回值:
 ① 成功,返回一个 socket 文件描述符。
 ② 错误,返回 -1 。

2.2 bind 系统调用

bind的作用:将本地地址和一个 socket 文件进行绑定。

bind的参数:
 ① sockfd:传入 socket 文件描述符。
 ② addr:用于指定本端的 socket 信息。
 ③ addrlen:用于指定本端的 socket 信息的大小。

bind的返回值:
 ① 成功,返回 0 。
 ② 错误,返回 -1 。
 

 

2.3 recvfrom 系统调用 

recvfrom的作用:从一个 socket 文件接收数据。

recvfrom的参数:
 ① sockfd:传入 socket 文件描述符。
 ② buf:用于存放读到的数据的用户层缓冲区。
 ③ len:用户层缓冲区的大小。
 ④ flags:读的方式。我们这里默认设为 0 即可。
 ⑤ src_addr:输入输出型参数,用于获取对端的 socket 信息。
 ⑥ addrlen:输入输出型参数,用于获取对端的 socket 信息的大小。

recvfrom的返回值:
 ① 成功,返回接收的字节数(当对端连接关闭时,返回 0)。
 ② 错误,返回 -1 。

2.4 sendto 系统调用 

sendto的作用:从一个 socket 文件发送数据。

sendto的参数:
 ① sockfd:传入 socket 文件描述符。
 ② buf:用于发送数据的用户层缓冲区。
 ③ len:发送数据的长度。
 ④ flags:发送的方式。我们这里默认设为 0 即可。
 ⑤ dest_addr:目标对端的 socket 信息。
 ⑥ addrlen:目标对端的 socket 信息的大小。

sendto的返回值:
 ① 成功,返回发送的字节数。
 ② 错误,返回 -1 。

 2.5 listen 系统调用

 

2.6 accept 系统调用 

 

2.7 connect 系统调用

 

 

 

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

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

相关文章

C 语言高级1-内存分区,多级指针,位运算

目录 1. 内存分区 1.1 数据类型 1.1.1 数据类型概念 1.1.2 数据类型别名 1.1.3 void数据类型 1.1.4 sizeof操作符 1.1.5 数据类型总结 1.2 变量 1.1.1 变量的概念 3.1.2 变量名的本质 1.3 程序的内存分区模型 1.3.1 内存分区 1.3.1.1 运行之前 1.3.1.2运行之后 1…

无涯教程-Perl - 循环语句

在某些情况下,您需要多次执行一个代码块。通常,语句是按顺序执行的:函数中的第一个语句首先执行,然后第二个执行,依此类推。 Perl编程语言提供了以下类型的循环来处理循环需求。 Sr.No.Loop Type & 描述1 while loop在给定条…

Redis-1

Redis 理论部分 redis 速度快的原因 1、纯内存操作 2、单线程操作,避免了频繁的上下文切换和资源争用问题,多线程需要占用更多的 CPU 资源 3、采用了非阻塞 I/O 多路复用机制 4、提供了非常高效的数据结构,例如双向链表、压缩页表和跳跃…

【从零开始学习JAVA | 第三十七篇】初识多线程

目录 前言: ​编辑 引入: 多线程: 什么是多线程: 多线程的意义: 多线程的应用场景: 总结: 前言: 本章节我们将开始学习多线程,多线程是一个很重要的知识点&#xff…

Java泛型(Generic)

文章目录 泛型概述泛型的引入 使用泛型举例集合中使用泛型 比较器中使用泛型相关使用说明自定义泛型结构自定义泛型类或泛型接口3.2.1 说明 自定义泛型方法举例练习 泛型在继承上的体现通配符的使用使用注意点有限制的通配符泛型应用举例 泛型概述 举例1:中药店&am…

第一章:继承

系列文章目录 文章目录 系列文章目录前言继承的概念及定义继承的概念继承定义定义格式继承关系和访问限定符继承基类成员访问方式的变化 基类和派生类对象赋值转换(公有继承)继承中的作用域派生类的默认成员函数继承与友元继承与静态成员不能被继承的类复…

学习系统编程No.35【基于信号量的CP问题】

引言: 北京时间:2023/8/2/12:52,时间飞逝,恍惚间已经来到了八月,给我的第一感觉就是快开学了,别的感觉其实没有,哈哈!看着身边的好友网络相关知识都要全部学完了,就好像…

Linux系统---进程概念

文章目录 冯诺依曼体系结构操作系统(OS)进程的理解 进程状态 进程优先级 环境变量 进程地址空间 一、冯诺依曼体系结构 我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。 如图为冯诺依曼体系结构图&…

【BEV感知】2-BEV感知算法数据形式

文章目录 1 图像1.1 如何获取图像特征? 2 点云2.1 稀疏性2.2 无序性2.3 为什么要用点云?2.4 如何提取点云特征?Point-basedVoxel-based 3 图像点云 1 图像 图像是由相机生成的,是将三维世界中的坐标点(单位为米&#…

I- yh的线段(2023河南萌新联赛第(四)场:河南大学)

链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 yh喜欢好线段,好线段即两条线段相交且不与其他线段重合的线段。 两条线段[l1,r1]和[l2,r2]相交(如果存在至少一个x,使得l1≤x≤r1和l2≤x≤r2,则认为两个线段…

Linux运维面试题(四)之Linux服务管理

Linux运维面试题(四)之Linux服务管理 4.1 SSHSSH的登录验证方式SSH的登陆端口(默认22)和监听设置(/etc/ssh/sshd_config)SSH的登录用户限制(/etc/ssh/sshd_config PermitRootLogin)SSH的登录超时设置(/etc/…

软件测试之Docker常见问题汇总!附解决方法!

1、配置国内源进行docker安装,报错 HTTP Error 404 - Not Found 【整整200集】超超超详细的Python接口自动化测试进阶教程,真实模拟企业项目实战!! 原因: 由于配置国内镜像源时,把地址写错了,导…

使用火山云搜索ESCloud服务构建图文检索应用(以文搜图/以图搜图)

图文检索在生活中具有广泛的应用,常见的图片检索包括基于文本内容搜索和基于图片内容搜索。用户通过输入文字描述或上传图片就可以在海量的图片库中快速找到同款或者相似图片,这种搜索方式被广泛应用于电商、广告、设计以及搜索引擎等热门领域。 本文基…

Windows服务器中IIS部署图片文件夹—超详细图文

Windows服务器中IIS部署图片文件夹—超详细图文 注意:部署前请先安装IIS IIS安装步骤可参照:win11安装IIS步骤—图解_win11 iis_咏絮v的博客-CSDN博客 1、打开 IIS管理器—选择【网站】后右键【添加站点】 2、【添加网站】(填写网站名称/物理路径/IP地…

2023华数杯数学建模C题思路代码 母亲身心健康影响

C 题 母亲身心健康对婴儿成长的影响 母亲是婴儿生命中最重要的人之一,她不仅为婴儿提供营养物质和身体保护, 还为婴儿提供情感支持和安全感。母亲心理健康状态的不良状况,如抑郁、焦虑、 压力等,可能会对婴儿的认知、情感、社会行…

【java】【maven】【基础】MAVEN安装配置介绍

目录 1 下载 2 安装-windows为例 3 配置环境变量 3.1 JAVA_HOME 3.2 MAVEN_HOME 3.3 PATH 3.4 验证 4 MAVEN基础概念 4.1 仓库概念 4.2 坐标概念 4.2.1 打开网址 4.2.2 输入搜索内容junit 4.2.3 找到对应API名称点击 4.2.4 点击对应版本 4.2.5 复制MAVEN坐标 4.3 配置…

计算机网络(4) --- 协议定制

计算机网络(3) --- 网络套接字TCP_哈里沃克的博客-CSDN博客https://blog.csdn.net/m0_63488627/article/details/132035757?spm1001.2014.3001.5501 目录 1. 协议的基础知识 TCP协议通讯流程 ​编辑 2.协议 1.介绍 2.手写协议 1.内容 2.接口 …

Vulnhub: blogger:1靶机

kali:192.168.111.111 靶机:192.168.111.176 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.176 在80端口的/assets/fonts/目录下发现blog目录,访问后发现为wordpress 利用wpscan发现wordpress插件wpdisc…

WiFi爆破实战

提示:本文记录了博主的一次WiFi爆破实战 文章目录 写在前面一、将网卡连接Kali虚拟机二、网卡配置骤2.1 识别网卡2.2 净化环境2.3 启动监听2.4 探测周边WiFi 三、实施攻击3.1 对选定的目标WiFi实施监听3.2 发起DOS攻击3.3 实施爆破 写在最后 写在前面 提示&#xf…

LNMP搭建及论坛搭建

一、LNMP LNMP架构是目前成熟的企业网站应用模式之一,指的是协同工作的一整套系统和相关软件, 能够提供动态Web站点服务及其应用开发环境。LNMP是一个缩写词,具体包括Linux操作系统、nginx网站服务器、MySQL数据库服务器、PHP(或…