【Linux】网络编程套接字

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.rhkb.cn/news/74819.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

flask------消息闪现 flash

1介绍 flask提供了一个非常有用的flash()函数,它可以用来“闪现”需要提示给用户的消息,比如当用户登录成功后显示“欢迎回来!”。在视图函数调用flash()函数,传入消息内容,flash()函数把消息存…

【C++】带三维重建和还原的RIS/PACS源码

【PACS】集成三维影像后处理功能,包括三维多平面重建、三维容积重建、三维表面重建、三维虚拟内窥镜、最大/小密度投影、心脏动脉钙化分析等功能。系统功能强大,代码完整。 一、RIS/PACS系统简介 RIS/PACS系统在预约登记、分诊叫号、技师检查、诊断报告…

提交App Store应用图标不能包含alpha通道

近日提交APP至App Store时遇到一个问题,在交付ipa时出现一个图标不符合规定的提示 翻译过来就是 资产验证失败(90717)应用商店图标无效。“HBuilder.App”中资产目录中的应用商店图标不能是透明的,也不能包含alpha通道。 因为我…

一台电脑给另外一台电脑共享网络

这里写自定义目录标题 有网的电脑上操作一根网线连接两台电脑没网的电脑上 有网的电脑上操作 右键->属性->共享 如同选择以太网,勾选。确认。 一根网线连接两台电脑 没网的电脑上 没网的电脑为mips&麒麟V10 新增个网络配置ww,设置如下。 …

ThinkPHP v6.0.8 CacheStore 反序列化漏洞

漏洞说明 1. 漏洞原理:ThinkPHP 6.0.8 CacheStore 会触发POP利用链子,造成任意命令执行 2. 组件描述: ThinkPHP是一个免费开源的,快速、简单的面向对象的轻量级PHP开发框架 3. 影响版本:V6.0.8 漏洞复现 1. 环境安…

【前端知识】React 基础巩固(四十)——Navigate导航

React 基础巩固(四十)——Navigate导航 一、Navigate的基本使用 新建Login页面,在Login中引入Navigate,实现点击登陆按钮跳转至/home路径下: import React, { PureComponent } from "react"; import { Navigate } from "reac…

苹果提交审核出现“您的 App 包含 NSUserTrackingUsageDescription...”解决办法

您的 App 包含 NSUserTrackingUsageDescription,这表示您将会请求追踪用户。要在 App 产品页上更新此信息,您必须注明哪些数据类型会追踪用户。如果此描述有误,请更新您的 App 二进制文件,并将新的构建版本上传到 App Store Conne…

软件测试环境对软件产品起到什么样的作用?

软件测试环境是为了进行软件测试而搭建的具体工作环境,它包括一系列硬件设备、软件工具、网络配置和测试数据等,对于保证软件产品的质量、功能和性能起到了至关重要的作用。 1、从行业实践的角度来看,软件测试环境是一个必不可少的工具。在软…

django使用ztree实现树状结构效果,子节点实现动态加载(l懒加载)

一、实现的效果 由于最近项目中需要实现树状结构的效果,考虑到ztree这个组件大家用的比较多,因此打算在django项目中集成ztree来实现树状的效果。最终实现的示例效果如下: 点击父节点,如果有子节点,则从后台动态请求数据,然后显示出子节点的数据。 二、实现思路 …

Mr. Cappuccino的第54杯咖啡——Mybatis运行原理

Mybatis运行原理 Mybatis运行的三个阶段Mybatis运行原理图 Mybatis运行的三个阶段 初始化阶段:读取并解析XML配置文件和注解中的配置信息,创建配置对象,并完成各个模块的初始化工作,底层采用建造者模式;代理封装阶段&…

宇凡微2.4g遥控船开发方案,采用合封芯片

2.4GHz遥控船的开发方案是一个有趣且具有挑战性的项目。这样的遥控船可以通过无线2.4GHz频率进行远程控制,让用户在池塘或湖泊上畅游。以下是一个简要的2.4GHz遥控船开发方案: 基本构想如下 mcu驱动两个小电机,小电机上安装两个螺旋桨&#…

【数字IC设计】VCS仿真DesignWare IP

DesignWare介绍 DesignWare是SoC/ASIC设计者最钟爱的设计IP库和验证IP库。它包括一个独立于工艺的、经验证的、可综合的虚拟微架构的元件集合,包括逻辑、算术、存储和专用元件系列,超过140个模块。DesignWare和 Design Compiler的结合可以极大地改进综合…

批量插入数据、MVC三层分离

八、批量插入数据 1、使用Statement() 2、使用PreparedStatement() 3、使用批量操作API 4、优化 九、MVC三层分离

[腾讯云Cloud Studio实战训练营]基于Cloud Studio完成图书管理系统

[腾讯云Cloud Studio实战训练营]基于Cloud Studio完成图书管理系统 ⭐前言🌜Cloud Studio产品介绍1.登录2.创建工作空间3.工作空间界面简介4.环境的使用 ⭐实验实操🌜Cloud Studio实现图书管理系统1.实验目的 2. 实验过程2.实验环境3.源码讲解3.1添加数据…

02 笔记本电脑m.2硬盘更换

1 工具展示 SN570的2T硬盘。够用了。 对于这台华为,使用的螺丝刀批头是4或5毫米的六边形批头。如果出现打滑的情况,请不要用蛮力哦。 2 更换过程 使用螺丝刀拧走后盖的螺丝(为了避免会出问题要再次打开,我到现在还没有把螺丝拧回…

高效构建 vivo 企业级网络流量分析系统

作者:vivo 互联网服务器团队- Ming Yujia 随着网络规模的快速发展,网络状况的良好与否已经直接关系到了企业的日常收益,故障中的每一秒都会导致大量的用户流失与经济亏损。因此,如何快速发现网络问题与定位异常流量已经成为大型企…

【JS交互篇】BOM基础、Window、Location、Navagator、Screen、History对象

一、BOM 概述 在 JavaScript 语言中有三种对象:内置对象、宿主对象、自定义对象。 宿主对象就是执行 JavaScript 脚本的环境所提供的对象。对于网页编程来说,js 是运行在浏览器上的,所以对于网页编程来说,宿主对象就是浏览器对象…

Spring详解(学习总结)

目录 一、Spring概述 (一)、Spring是什么? (二)、Spring框架发展历程 (三)、Spring框架的优势 (四)、Spring的体系结构 二、程序耦合与解耦合 (一&…

SOP/详解*和**/python数据结构(iter,list,tuple,dict)/ 解包

一、错误解决合集 1. > combined_seq.named_children() 2. isinstance 2th parameter : must be a type or tuple of types > 改为tuple,不要用列表。改为 LLLayer (nn.Conv2d,nn.Linear) 3. File “test.py”, line 90, in calculate_fin_fout print(“hi”…