【网络编程】网络编程套接字(一)

news2024/11/17 15:47:30

文章目录

  • 网络编程预备知识
  • 认识端口号
  • 理解源端口号和目的端口号
  • 认识TCP协议和UDP协议
  • 网络字节序
  • sockaddr结构
    • 1.socket 常见API
    • 2.sockaddr结构

网络编程预备知识

认识端口号

端口号(port)是传输层协议的内容.

端口号是一个2字节16位的整数;
端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理;
IP地址 + 端口号能够标识网络上的某一台主机的某一个进程;
一个端口号只能被一个进程占用.

既然端口号是用来标识一个进程,而我们之前学习进程的时候,pid也可以标识一个进程,那他们之间有什么关系呢?

端口号可以标识一个进程,pid也可以标识一个进程,但是一个端口号只能标识一个进程,而一个进程可以被多个端口号标识,而进程pid与进程是一一对应的。
并且,我们可以通过我们身边的例子来理解,例如我们在出生之后都会有一个身份证号来标识一个,但是在学校的时候通常使用学号来标识一个人,工作的时候通常使用工号来表示一个人,并不是所有的进程都会进行网络通信,反过来只有一少部分进程进行网络通信,大部分都是本地进程,所以使用pid来标识网络通信是不合适的。

理解源端口号和目的端口号

上一篇文章提到了IP地址的作用,通过IP地址和MAC地址可以标识全网唯一的一台机器,而这里的端口号可以唯一的确定一台主机中唯一的一个进程。
我们需要明确的是:

进行网络通信,并不只是两台主机建立联系,而主要任务是在建立联系之后,我们进行进程间通信,将一个进程的数据通过网络传送给另外一个进程,所以与之前的匿名管道,命名管道,信号量,共享内存等进程间通信的方式比较,只是通过网络进行传输而已。

传输层协议(TCP和UDP)的数据段中有两个端口号, 分别叫做源端口号和目的端口号. 就是在描述 “数据是谁发的, 要发给谁”;

认识TCP协议和UDP协议

此处我们也是对UDP(User Datagram Protocol 用户数据报协议)有一个直观的认识;

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


此处我们先对TCP(Transmission Control Protocol 传输控制协议)有一个直观的认识;

传输层协议
有连接
可靠传输
面向字节流

网络字节序

我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分, 网络数据流同样有大端小端之分. 那么如何定义网络数据流的地址呢?
其实,网络中的数据流传输都是通过大端方式的,但是可能我们的主机是小端,所以我们就需要 引入几个接口来实现大小端的转换:
在这里插入图片描述
记忆方法:

这些函数名很好记,h表示host,n表示network,l表示32位长整数,s表示16位短整数。
例如htonl表示将32位的长整数从主机字节序转换为网络字节序,例如将IP地址转换后准备发送。
如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回 ;
如果主机是大端字节序,这些 函数不做转换,将参数原封不动地返回。

如何区分大小端?

大端就是将高位字节存在低地址处,低位字节存在高地址处。
小端就是将高位字节存在高地址处,低位字节存在低地址处。

sockaddr结构

1.socket 常见API

// 创建 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.sockaddr结构

socket API是一层抽象的网络编程接口,适用于各种底层网络协议,如IPv4、IPv6,以及后面要讲的UNIX Domain Socket. 然而, 各种网络协议的地址格式并不相同,例如我们不仅可以通过这套接口进行网络之间通信,也可以进行域间套接字通信,所以为了保持接口一致性,设计出了不同的结构,在传参时,传入不同的结构即可。
在这里插入图片描述
sockaddr_in结构体用于跨网络通信,sockaddr_un结构体用于本地通信,之所以可以在传入参数时可以通过不同参数来确定网络间通信或者本地通信,因为sockaddr_in和sockaddr_un前两个字节是相同的,是用来标定协议家族的,所以我们要对结构体进行填充,在调用时进行强转成sockaddr类型再传入。

sockaddr结构
sockaddr的结构

sockaddr_in结构
在这里插入图片描述

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

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

相关文章

Linux :LNMP(源码包安装)

Linux 虚拟机 VMware:安装centos7_鲍海超-GNUBHCkalitarro的博客-CSDN博客 物理机 linux:真机安装centos linux(突发事件:解决卡在安装界面){寻找镜像--u启制作--引导u盘--解决卡在安装界面--安装配置}_安装centos7卡…

Linux--文件/目录权限

看懂权限: 拥有者:文件属于谁 所属组:文件属于哪个组 other:不属于上面两种的任何一个,就是other 图示: 分析: ①第一列: d:目录 -:普通文件 p:管道文件 b:块设备 c:字符设备 l:链接…

数学建模概论

1、从现实对象到数学模型 我们常见的模型 玩具、照片......~实物模型水箱中的舰艇、风洞中的飞机......~物理模型地图、电路图、分子结构图......~符号模型 模型是为了一定目的,对客观事物的一部分进行简缩、抽象、提炼出来的原型的替代物,集中反映了原型…

【C++1】函数重载,类和对象,引用,string类,vector容器,类继承和多态,/socket

文章目录 1.函数重载:writetofile(),Ctrue和false,C0和非02.类和对象:vprintf2.1 构造函数:对成员变量初始化2.2 析构函数:一个类只有一个,不允许被重载 3.引用:C中&取地址&…

沁恒CH32V307VCT6最小系统板/开发板开源

沁恒CH32V307VCT6最小系统板,引出了所有IO口,一个Type-C连接到USB2.0全速OTG接口,一个Flash芯片 型号W25Q64 容量64Mbit 连接到SPI2接口,板上还有TL432电压基准1.25V(实测1.246V左右)可通过跳线连接到PC3的AD13,还有3.…

【c++】并行编程:cuda入门

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍cuda入门。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路&#x1f95e…

测试在 4090 上运行 vicuna-33b 进行推理

测试在 4090 上运行 vicuna-33b 进行推理 今天尝试在 4090 上运行 vicuna-33b 进行推理,使用的是 8bit 量化。 运行命令如下, python3 -m fastchat.serve.cli --model-path lmsys/vicuna-33b-v1.3 --load-8bit结论,使用 8bit 量化在 4090 上…

HTTP概述以及Tomcat概述

HTTP 概念:Hyper Text Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则。特点: 基于TCP协议:面向连接、安全基于请求-响应模型的:一次请求对应一次响应HTTP协议是无状态的协议…

Java面试题3

[TOC]目录 1. spring事务 事务简介 事务在逻辑上是一组操作,要么执行,要不都不执行。主要是针对数据库而言的,比如说 MySQL。 为了保证事务是正确可靠的,在数据库进行写入或者更新操作时,就必须得表现出 ACID 的 4 …

nexus搭建maven私有仓库

Nexus 在企业开发中还是比较常用的私有仓库管理工具,一般把公司内部的Maven jar 包或npm包上传到仓库中,有效的对包文件进行管理。 Nexus 至少需要 2G 以上的内存 安装nexus之前首先安装配置好 JDK 环境 和 Maven环境 1、Linux环境安装openJDK 2、Centos…

机器学习——掌握决策树ID3算法的原理,通过增益熵实现手工推导的过程。

文章目录 决策树介绍优缺点ID3算法原理举例 决策树的构建1、特征选择(1)香农熵(2)信息增益 2、决策树的生成3、决策树的修剪 总结:参考文献 决策树 介绍 决策树(decision tree)是一种基本的分类与回归方法。ID3是其中…

模拟实现atoi

函数简介 atoi (表示 ascii to integer)是把字符串转换成整型数的一个函数,应用在计算机程序和办公软件中。int atoi(const char *nptr) 函数会扫描参数 nptr字符串,会跳过前面的空白字符(例如空格,tab缩进)等。如果 n…

socket 网络编程

socket UDP1、单播收发数据测试2、广播发送 TCP1、收发数据测试2、TCP 服务端 Socket是两个程序之间的双向通信链路。它是一种网络通信协议,用于不同计算机之间的进程间通信或同一计算机内部进程之间的通信。 import sockets socket.socket(AddressFamily, Type)…

初识【Matplotlib】

Matplotlib Matplotlib简单介绍Matploylib的分类学习Matploylib网站推荐Matplotlib用法Matplotlib中文字体显示Matplotlib的三层结构容器层图像层辅助显示层 Matplotlib简单介绍 Matplotlib是一个Python的数据可视化库,它提供了一种简单而有效的方式来创建各种类型…

02-独立按键控制LED状态

程序 #include <REGX52.H>void main() {while(1) {if(P3_1 0) //DOWN{P2_0 0xFE;}if(P3_1 1) //UP{P2_0 0XFF;}};}按键的抖动问题 软件实现解决-按键的抖动问题 通过延时解决 #include <REGX52.H>void Delay(unsigned int xms) {while(xms){unsigned cha…

【C语言】整型在内存中存储 赛场(来试试)

前言 &#x1f388;大家好&#xff0c;我是何小侠&#x1f388; &#x1f343;大家可以叫我小何或者小侠&#x1f343; &#x1f490;希望能通过写博客加深自己对于学习内容的理解&#x1f490; &#x1f338;也能帮助更多人理解和学习&#x1f338; 合抱之木&#xff0c;生于…

简单实用配置VScode的C# Framework环境

1. 设置window path环境csc变量 D:\Program Files\Microsoft Visual Studio\2022\Professional\MSBuild\Current\Bin\Roslyn 或者 C:\Windows\Microsoft.NET\Framework64\v4.0.30319 2. 设置"code-runner.executorMap" "csharp": "cd $dir &…

第五课—大学英语四六级备考—听力专项

Key words 1.implement vt.实施 "Implement" 在中文中的意思是「实施」或「执行」。以下是一些示例用法和搭配&#xff1a; 中文意思&#xff1a;实施、执行 形近字&#xff1a;implicate&#xff08;牵连&#xff09; 1. 用英文造句&#xff1a;The government …

【C++初阶(二)】缺省参数以及函数重载

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C初阶之路⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习排序知识   &#x1f51d;&#x1f51d; 缺省参数&#xff06;函数重载 1. 前言2. 缺…

红黑树内容及代码实现

目录 1.概念 2.性质 3.实现 3.1定义数据类型 3.2设计基本操作 3.2.1着色问题详解 3.2.2 代码基本框架 3.2.3着色问题代码 3.2.4红黑树的销毁 3.3验证基本操作 4.总结 1.概念 红黑树是一种二叉搜索树&#xff0c;但是在其中的每个结点上增加一个存储表示该节点的颜…