当前位置: 首页 > news >正文

socket编程

文章目录

  • 套接字
  • 网路字节序列
  • TCP和UDP套接字

本文章主要介绍Linux下套接字的相关接口,和一些基础知识。

套接字

所有网络通信的行为本质都是进程间进行通信,网络通信也是进程间通信,只不过是不同主机上的两个进程之间的通信。网络通信对于双方来说首先要先把数据到达对方的机器,然后在到达对应的进程。而套接字就是IP地址+端口号,IP地址可以确定互联网中唯一的一台主机,而端口号可以表示某个主机中进程的唯一性。所以IP+端口号就可以确定互联网中的唯一一个进程。

如何理解端口号(port)?
可以表示当前主机上唯一的一个进程,不采用pid的原因主要是为了把网络模块和进程模块进行解耦。port专门用来网络通信,一个端口号只能关联一个进程,而一个进程可以关联多个端口号。

网路字节序列

对于我们不同的主机,使用的存储方案是不同的,有的是大端机有的是小端机,所以网络为了保证网络传输的过程中,对方都能准确的把对方的数据拿到并正确读取,网路就规定所有到达的网络的数据必须是大端,因此所有从网络收的数据,都会是大端数据。
但是因为我们的机器可能是大端或者小端,我们需要通过网络传输数据是还需要自己进行转换,比较麻烦,所以系统用给了我们把主机序列转网络序列的接口,同样也提供了网络转主机的接口。
在这里插入图片描述
h 就是主机,n就是网络。

IP地址我们看到的是点分十进制的,但是在代码里面一个整型变量就可以存储。所以系统中还存在很多把IP地址的点分十进制和整型来回转化的函数。

在介绍这些函数之前先来了解一下网络中的几个结构体字段。
在这里插入图片描述
IPv4和IPv6的地址格式定义在netinet/in.h中,IPv4地址用sockaddr_in结构体表示,包括16位地址类型, 16位端口号和32位IP地址.
IPv4、IPv6地址类型分别定义为常数AF_INET、AF_INET6. 这样,只要取得某种sockaddr结构体的首地址,不需要知道具体是哪种类型的sockaddr结构体,就可以根据地址类型字段确定结构体中的内容.
socket API可以都用struct sockaddr *类型表示, 在使用的时候需要强制转化成sockaddr_in; 这样的好处是程序的通用性, 可以接收IPv4, IPv6, 以及UNIX Domain Socket各种类型的sockaddr结构体指针做为参数;

sockaddr
在这里插入图片描述
sockaddr_in
在这里插入图片描述
in_addr
在这里插入图片描述
可以看到底层的in_addr_t就是一个整型变量。

IP地址的点分十进制和整型来回转化的函数
在这里插入图片描述
根据接口差不多就可以猜到谁转化谁了。
在这里插入图片描述这个函数是把字符串转整型的,src就是需要转化的,dst就是需要转化到哪里。af为网络类型,一般网络为AF_INET。

在这里插入图片描述
这个函数是把整型转字符串的,src就是需要转化的,dst就是需要转化到哪里。size为dst缓冲区的大小。af为网络类型,一般网络为AF_INET。

其中inet_pton和inet_ntop不仅可以转换IPv4的in_addr,还可以转换IPv6的in6_addr,因此函数接口是void
*addrptr。

TCP和UDP套接字

TCP为可靠通信,UDP为不可靠通信,这里的可靠不可靠是中性词,可靠表示更为复杂,通信是需要做更多的工作,而不可靠,说明更简单,适用对数据可靠性不高的场景。它们只有不同,没有好坏。

TCP和UDP通信一般为CS模式。一般情况下:
客户端不允许调用bind(), 没有必要调用bind()固定一个端口号. 否则如果在同一台机器上启动多个客户端, 就会出现端口号被占用导致不能正确建立连接;
服务器也不是必须调用bind(), 但如果服务器不调用bind(), 内核会自动给服务器分配监听端口, 每次启动服务器时端口号都不一样, 客户端要连接服务器就会遇到麻烦;
而服务器一般不绑定固定的IP,一般把服务器bind的IP设置为INADDR_ANY(0),表示绑定本机的任所有P地址。因为一台主机可能有多个IP地址,而只绑定一个,对于另一个IP的请求就收不到了,所以一般IP也不固定。

SOCK场景的API
在这里插入图片描述
TCP和UDP创建套接字是domain都为AF_INET,TCP的type为SOCK_STREAM,UDP的为SOCK_DGRAM,最后一个一般为0,因为前两个参数确定,第三个就可以确定了。
UDP读取一般使用recvfrom
在这里插入图片描述
TCP读取数据一般使用recv
在这里插入图片描述
UDP发送一般使用sendto
在这里插入图片描述
TCP发送一般使用send
在这里插入图片描述
创建UDP服务器一般为socket创建套接字,socket会返回一个类似文件描述符的东西,以后通信就需要依靠这个文件描述符了,然后进行bind服务器的端口和IP,然后就是进行数据的发送和读取了。
创建TCP服务器一般为socket创建套接字,然后进行bind,设置套接字的listen属性,然后进行accept进行监听,有连接到来就返回一个新的文件描述符和该请求服务的进程通信,监听套接字接着监听。所以它们大多数情况下都需要创建线程去处理连接,主线程监听连接。

http://www.lryc.cn/news/394254.html

相关文章:

  • python自动移除excel文件密码(升级v2版本)
  • 深入MOJO编程语言的单元测试世界
  • Canvas:掌握颜色线条与图像文字设置
  • 打包导入pyzbar的脚本时的注意事项
  • 02-android studio实现下拉列表+单选框+年月日功能
  • 曹操的五色棋布阵 - 工厂方法模式
  • 谷粒商城学习笔记-逆向工程错误记录
  • FastAPI+SQLAlchemy数据库连接
  • Android中的适配器,你知道是做什么的吗?
  • GitHub详解:代码托管与协作开发平台
  • 【植物大战僵尸杂交版】获取+存档插件
  • BP神经网络与反向传播算法在深度学习中的应用
  • 【数据结构与算法】插入排序
  • MySQL如何实现数据排序
  • 给我的 IM 系统加上监控两件套:【Prometheus + Grafana】
  • 【Python】基于动态规划和K聚类的彩色图片压缩算法
  • 【做一道算一道】和为 K 的子数组
  • Facebook应用开发:认证与授权登录流程详解
  • 实战:搭建一款属于自己的个人知识库~docusaurus(强大且丝滑)-2024.7.7(测试成功)
  • Java教程之IO模式精讲,NIO+BIO
  • 如何让代码兼容 Python 2 和 Python 3?Future 库助你一臂之力
  • AI让大龄程序员重新焕发活力
  • Python在现代办公自动化中的应用:会不会被裁?就看你的效率了!
  • Laravel5+mycat 报错 “Packets out of order”
  • 使用androidx.appcompat:appcompat:1.7.0无法运行的问题
  • 基于Java的水果商品销售网站
  • Redis 线程模型
  • 栈和队列---循环队列
  • 打卡第4天----链表
  • 07-7.1.1 查找的基本概念