网络编程套接字(一)

目录

一、源IP和目的IP

二、端口号

三、UDP协议和TCP协议

四、网络字节序

五、socket编程

1、socket 常见接口

2、struct sockaddr结构体


一、源IP和目的IP

IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。

每台主机都有自己的IP地址,所以当数据从一台主机传输到另一台主机就需要IP地址,数据传输时,报头里面就包含了IP地址。为什么呢?因为在现在的互联网世界,每台主机的IP地址都是唯一的,而且是全球唯一的,所以一个IP地址能够标识世界上一个唯一的一个主机。于是,我们就能通过IP地址找到目的主机了。

源IP地址:发送数据报那个主机的IP地址,目的IP地址:想发送到的那个主机的IP地址。

二、端口号

但是,我们的最终目的仅仅是想把信息从一台主机发送到另一台主机吗?当然不是,我们最终的目的应该是将信息发送到主机上的软件的!

举个例子,你点开了抖音客户端,就相当于在手机上启动了一个进程,那么字节跳动公司的服务器将会把抖音的内容,通过网络传输给你的手机,但是不会仅仅传到手机上就好了,而是会将信息传给手机上的抖音客户端,也就是你启动的一个进程!

那么为什么抖音的服务器知道把信息传给抖音客户端,而不是美团或者qq客户端呢?这就是我们端口号的作用了。

我们使用端口号来标识某个主机上的一个进程!于是,抖音服务器通过IP地址找到主机,通过唯一的端口号找到主机上的抖音客户端进程,就能够把信息推送给抖音客户端,让用户就能够看到了。

端口号:

1、端口号是一个2字节16位的整数。
2、端口号用来标识一个进程,告诉操作系统要把数据交给哪一个进程。
3、在同一个主机中,一个端口号只能被一个进程占用。

所以说,通过全网唯一IP地址能够找到唯一的主机,然后通过端口号能够标识网络上的某一台主机的某一个进程,那么我们通过(IP地址,端口号)的组合,就能够找到全网唯一的进程了!那么网络通信的本质就是进程间的通信!而我们把(IP地址,端口号)的组合称为套接字。

注:一个端口号只能被一个进程占用,但是一个进程可以绑定多个端口号。

三、UDP协议和TCP协议

TCP和UDP协议是TCP/IP协议的核心。他们都属于传输层协议。

~ TCP协议特点:

有连接(正式通信前要先建立连接)
可靠传输
面向字节流

~ UDP协议特点:

无连接
不可靠传输
面向数据报

如果发送数据时出现了丢包的情况、或者数据被重复传递了(传递了多份)、或者网络出现了问题等等造成的后果就叫做不可靠。

与此相对,可靠传输则通过各种机制(如确认信息、重传等)来确保数据的完整性和可靠性。TCP就是一种可靠的传输,但是它的可靠一定是通过大量的代码去维护实现的。当然,UDP虽然是不可靠传输,但是它的使用成本低。我们应该根据不同的场景,去选择协议。

四、网络字节序

我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分。小端:低权值的数放入低地址。大端:低权值的数放入高地址。

正是因为有了大小端的区分,我们就有了这样一个问题:两台主机在进行网络通信的时候,如果一个主机是大端机,而另一个主机是小端机,那么因为两个主机对于数据在内存中的存储方式不一样,必定会解析错误对方发过来的信息。

所以就有了这样的规定:在进行网络传输的时候,网络中的数据都是大端。发送数据的主机如果是大端机就不用管,如果是小端机就把小端转成大端再发送。接收数据的主机收到的也是大端的,然后将数据转换成自己能够识别的字节序。

为了方便,我们可以调用库函数进行网络字节序和主机字节序之间的转换:

#include <arpa/inet.h>
// 主机序列转网络序列
uint16_t htons(uint16_t hostshort);
uint32_t htonl(uint32_t hostlong);

// 网络序列转主机序列
uint16_t ntohs(uint16_t netshort);
uint32_t ntohl(uint32_t netlong);

比如,h表示host,n表示network,l表示32位长整数,s表示16位短整数。 htons就表示由主机字节序转成网络字节序,且为短整型。

如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回。如果主机是大端字节序,这些函数不做转换,将参数原封不动地返回。

五、socket编程

1、socket 常见接口

下面的接口会在后面详细讲解使用。

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

// 绑定端口号 (TCP/UDP, 服务器)
int bind(int socket, const struct sockaddr *address,
socklen_t address_len);

// 开始监听socket (TCP, 服务器)
int listen(int socket, int backlog);

// 接收请求 (TCP, 服务器)
int accept(int socket, struct sockaddr* address,
socklen_t* address_len);

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

2、struct sockaddr结构体

上面的函数中,有一个参数 struct sockaddr 结构体很重要,我们需要重点知道。

IP地址和端口号port,我们称为套接字。而套接字种类比较多。我们常见的有以下三种:

1、网络套接字    2、原始套接字    3、unix域间套接字

原始套接字可以跨过传输层(TCP/IP协议)访问底层的数据。域间套接字就是我们常用来进行同主机的进程间通信的,也是属于进程间通信的一种,我们在之前在讲进程间通信的时候,也提到了套接字的通信方式。

今天我们主要了解进行网络通信的网络套接字。(网络套接字也能进行本地通信)

这些套接字应用场景完全不同,所以我们想用就得用三套不同的接口,但是他们的结构和操作方式又比较相似,所以为了方便,设计者只设计了一套接口,就可以通过传入不同的参数,解决所有网络或者其他场景下的通信问题。

比如,网络套接字和域间套接字。

套接字的通用结构就是上图的第一个:struct sockaddr,也就是socket相关函数里面的参数的结构。

struct sockaddr_in就是网络套接字的结构,struct sockaddr_un就是域间套接字的结构。

我们使用struct sockaddr的前2个字节来区分该套接字是网络套接字还是域间套接字,AF_INET代表网络套接字,AF_UNIX代表域间套接字。

struct sockaddr_in里面,包含了端口号和IP地址。struct sockaddr_un里面,就是包含了路径名,通过相同路径下的同一个文件来让进程看到同一份资源,相当于进程间通信的管道一样。

对于网络通信,函数的参数是const struct sockaddr *addr,但实际传递进去的却是sockaddr_in结构体,所以我们在使用时一定要进行类型强转。

注:我们可以把struct sockaddr看成基类,把sockaddr_in和sockaddr_un看成派生类,这样构成了多态。相当于使用相同的 struct sockaddr 结构达到了不同的作用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

原子操作和竞争条件

所有系统调用都是以原子操作方式执行的。之所以这么说&#xff0c;是指内核保证了某系统调用中的所有步骤会作为独立操作而一次性加以执行&#xff0c;其间不会为其他进程或线程所中断。原子性是某些操作得以圆满成功的关键所在。特别是它规避了竞争状态&#xff08;race condi…

解决ModuleNotFoundError: No module named ‘exceptions‘

一、问题描述 使用python语言处理docx文档&#xff0c;在安装docx库时出现问题&#xff0c;No module named ‘exceptions‘ 二、解决方法 卸载docx&#xff0c;安装python-docx。 pip uninstall docx pip install python-docx 问题解决&#xff01;

SSRF靶场

SSRF概述 ​ 强制服务器发送一个攻击者的请求 ​ 互联网上的很多web应用提供了从其他服务器&#xff08;也可以是本地)获取数据的功能。使用用户指定的URL&#xff0c;web应用可以获取图片&#xff08;载入图片&#xff09;、文件资源&#xff08;下载或读取)。如下图所示&…

[lesson17]对象的构造(上)

对象的构造(上) 对象的初始化 从程序设计的角度&#xff0c;对象只是变量&#xff0c;因此&#xff1a; 在栈上常见对象时&#xff0c;成员变量初始为随机值在堆上创建对象时&#xff0c;成员变量初始为随机值在静态存储区创建对象时&#xff0c;成员变量初始为0值 生活中的对…

算法打卡day41|动态规划篇09| Leetcode198.打家劫舍、213.打家劫舍II、337.打家劫舍 III

算法题 Leetcode 198.打家劫舍 题目链接:198.打家劫舍 大佬视频讲解&#xff1a;198.打家劫舍视频讲解 个人思路 偷还是偷&#xff0c;这取决于前一个和前两个房是否被偷了&#xff0c;这种存在依赖关系的题目可以用动态规划解决。 解法 动态规划 动规五部曲&#xff1a;…

生鲜蔬果配送小程序开发攻略

随着互联网的快速发展&#xff0c;电商行业也在不断壮大。生鲜蔬果作为日常生活必需品&#xff0c;在线销售的需求也在不断增加。为了满足这一需求&#xff0c;开发一款生鲜蔬果配送小程序成为了必要的事情。下面就给大家介绍开发这款小程序的攻略。 1. 确定开发需求 首先&…

Java Swing游戏开发学习23

内容来自RyiSnow视频讲解 这一节讲的是Character Status角色状态或属性。 前言 这一节讲的是实现角色状态或属性的显示&#xff0c;就有点像RPG游戏中&#xff0c;人物属性显示的面板&#xff0c;其中有玩家的装备、玩家的等级&#xff0c;各种防御值、闪避值、跑速什么的。…

基于BP神经网络的分类预测模型matlab代码

基于BP神经网络的分类预测模型matlab代码&#xff0c;该数据集下&#xff0c;本模型的表现优异&#xff0c;训练集准确率可达97%&#xff0c;测试集准确率可达93.5%&#xff0c;表现优异。注释十分齐全适合新手学习。 代码获取链接&#xff1a;基于BP神经网络的分类预测模型ma…

SpringBoot3 + uniapp 对接 阿里云0SS 实现上传图片视频到 0SS 以及 0SS 里删除图片视频的操作(最新)

SpringBoot3 uniapp 对接 阿里云0SS 实现上传图片视频到 0SS 以及 0SS 里删除图片视频的操作 最终效果图uniapp 的源码UpLoadFile.vuedeleteOssFile.jshttp.js SpringBoot3 的源码FileUploadController.javaAliOssUtil.java 最终效果图 uniapp 的源码 UpLoadFile.vue <tem…

第十一届蓝桥杯省赛真题(C/C++大学B组)

试题A &#xff1a;门牌制作 #include <bits/stdc.h> using namespace std;const int N 100000; int arr[N];int main() {int ans 0,t;for(int i 1;i < 2020;i){t i;while(t > 0){if(t % 10 2) ans;t / 10;}}cout<<ans<<endl;return 0; } 试题B …

操作系统(第四周 第一堂)

目录 回顾 进程调度&#xff08;process schedule&#xff09; 进程角度 计算机整体——调度队列 队列图 调度程序 总结 回顾 上一篇文章的重点只有一个————进程 对进程的了解包含以下几个方面&#xff1a;1、程序如何变为进程 2、进程在内存中的存储形式 3、进…

Centos7配置秘钥实现集群免密登录

设备&#xff1a;MacBook Pro、多台Centos7.4服务器(已开启sshd服务) 大体流程&#xff1a;本机生成秘钥&#xff0c;将秘钥上传至服务器即可实现免密登录 1、本地电脑生成秘钥&#xff1a; ssh-keygen -t rsa -C "邮箱地址 例&#xff1a;*****.163.com"一路回车…

Bezier曲线的绘制 matlab

式中&#xff1a; 称为基函数。 。 因为n表示次数&#xff0c;点数为n1&#xff0c;显然i表示第i个控制点。 显然在Matlab中可以同矩阵的形式来计算C(u)。 关键代码为&#xff1a; clc clear % 假设控制点P取值为&#xff1a; P [4,7;13,12;19,4;25,12;30,3]; % 因此&a…

Vue2创建过程记录

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、搭建node二、安装Vue CLI三、搭建新项目四、Elemet安装&#xff08;参照官网步骤[Element官网](https://element.eleme.cn/#/zh-CN/component/installation)&am…

Hibernate多事务同时调用update(T t) ,字段被覆盖问题

前言 今天现网有个订单卡单了&#xff0c;经过排查发现没有任何异常日志&#xff0c;根据日志定位发现本应该更新的一个状态&#xff0c;也sql肯定执行了(使用了Hibernate的ORM框架)&#xff0c;但是数据库里面的状态没有更新。大概逻辑如下 String hql from orderInfo where…

Could not resolve all files for configuration

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 未经允许不得转载 目录 一、导读二、概览三、 推荐阅读 一、导…

《前端防坑》- JS基础 - 你觉得typeof nullValue === null 么?

问题 JS原始类型有6种Undefined, Null, Number, String, Boolean, Symbol共6种。 在对原始类型使用typeof进行判断时, typeof stringValue string typeof numberValue number 如果一个变量(nullValue)的值为null&#xff0c;那么typeof nullValue "?" const u …

C++的并发世界(十一)——线程池

0.线程池的概念 1.线程池使用步骤 ①初始化线程池&#xff1a;确定线程数量&#xff0c;并做好互斥访问&#xff1b; ②启动所有线程 ③准备好任务处理基类&#xff1b; ④获取任务接口&#xff1a;通过条件变量阻塞等待任务 2.atomic原子操作 std:atomic是C11标准库中的一个…

QT学习day4

widget.h #define WIDGET_H #include <QWidget> #include <QTime>//时间类 #include <QTimerEvent>//定时器类 #include <QPushButton>//按钮类 #include <QTextToSpeech>//语音播报 QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_E…

After Effects 2024 中文激活版 高效工作流程与创新的视觉特效 mac/win

After Effects 2024是Adobe公司推出的一款专业视频特效制作软件&#xff0c;广泛应用于电影、电视、动画等媒体制作领域。它凭借强大的功能和灵活的操作&#xff0c;帮助用户轻松创建电影级影片字幕、片头和过渡效果&#xff0c;以及实现立体效果和动态场景的切换。 同时&#…