socket套接字

news2024/9/30 9:36:30

在这里插入图片描述

欢迎关注博主 Mindtechnist 或加入【Linux C/C++/Python社区】一起探讨和分享Linux C/C++/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。


socket套接字

    • 1. 什么是socket套接字
    • 2. socket编程
    • 3. 网络字节序
    • 4. IP地址转换函数
    • 5. sockaddr数据结构
    • 6. 网络套接字函数
    • 7. TCP通信流程图


专栏:《网络编程》《Linux从小白到大神》


1. 什么是socket套接字

套接字就像一个插座,插座需要一个插头来连接双方才能通电,而socket通信也需要两个端,一个服务端一个客户端。一般来说,服务端是被动的,客户端是主动的,也就是说服务端应该先启动,启动之后就被动的去准备被(客户端)连接以提供服务,而客户端需要服务的时候就主动去连接服务器端。

实际上,socket编程就是网络IO编程,同样也是读写操作,只不过是对网络进行读写,通过read/write和文件描述符来完成读写。我们在创建套接字的时候,会得到文件描述符,然后就可以通过这个文件描述符来完成读写操作。

实际上,我们在进程间通信时用的管道也是在内核中分配一块缓冲区,这个缓冲区是用一个环形队列来维护的,本质是内存中的一块存储空间,在管道的读写两端分别对应一个文件描述符,操作读端的文件描述符fd就相当于操作内核缓冲区。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NdD0PWy6-1672383966901)(Typora_picture_reference/1660273767824.png)]

套接字创建成功后,也会得到一个文件描述符fd,通过fd来操作一块内核缓冲区。在服务器端创建一个套接字,就会得到一个内核缓冲区和文件描述符,这个缓冲区分为读写两部分。在客户端发数据使用的是write操作,当我们执行write(fd)的时候,数据并不是直接写到网上的,而是先写到文件描述符对应的内核缓冲区中的写缓冲区部分,写缓冲区中只要有数据就会自动发送到服务器端的读缓冲区中,服务器端通过read就可以把数据读出。我们所做的只有read和write操作,其他操作都是由操作系统完成的。需要注意的一点是,读缓冲区中的数据读走了之后就没有了,和管道一样。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aAxUpTMS-1672383966902)(Typora_picture_reference/1660274216613.png)]

套接字对应的文件描述符默认也是阻塞的,实际上阻塞是文件描述符对应的文件所拥有的性质,而不是read/write的属性,这两个函数只负责读取或者写数据,即阻塞性质是对文件描述符所对应的文件类型而言的。

2. socket编程

  • socket是一套网络通信的函数接口
  • socket内封装了传输层协议
    • TCP
    • UDP

socket编程就是使用别人提供的一套网络通信接口进行编程。比如说我们使用浏览器搜索内容,浏览器使用的是HTTP协议,而HTTP协议再往下封装的就是TCP协议。

在套接字编程时需要IP和Port:

  • IP地址:在网络环境中,需要IP来定位一台主机

  • 端口号Port:在一台主机上,需要Port来定位一个进程

  • IP:Port

3. 网络字节序

  • 大端:网络字节序,数据的高位字节存储在内存的低地址。
  • 小端:主机字节序,数据的高位字节存储在内存的高位地址。常见的主机数据都是小端存储。

函数介绍:

#include <arpa/inet.h>

(1) 主机字节序转网络字节序

uint16_t htons(uint16_t hostshort); //端口
uint32_t htonl(uint32_t hostlong); //IP

(2) 网络字节序转主机字节序

uint16_t ntohs(uint16_t netshort); //端口
uint32_t ntohl(uint32_t netlong); //IP

假如说我们要将小端字节序转换为大端字节序,如果主机是小端字节序,这些函数将参数做相应的大小端转换后返回,如果主机是大端字节序,这些函数将不做任何变换,将参数原封不动的返回。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nRLDsHML-1672383966902)(Typora_picture_reference/1660305362431.png)]

常见的文件字节序:

  • Adobe PS — Big Endian
  • BMP — Little Endian
  • GIF — Little Endian
  • JPEG — Big Endian
  • MacPaint — Big Endian
  • RTF — Little Endian

注:在Java以及所有的网络通讯协议都是使用Big-Endian编码。

4. IP地址转换函数

指定IP转换为点分十进制字符串

  • 本地IP转网络字节序:字符串 —> int(大端方式存储)

    int inet_pton(int af, const char* src, void* dst);
    
    • af:地址簇协议
    • src:点分十进制IP
    • dest:传出参数,转换后的int整形的存放地址
  • 网络字节序转本地IP:int —> 字符串

    const char *inet_ntop(int af, const void* src, char* dst, socklen_t size);
    

5. sockaddr数据结构

  • sockaddr
  • sockaddrin
  • sockaddrun
struct sockaddr {	
	/* address family, AF_xxx */
	sa_family_t sa_family; 
	/* 14 bytes of protocol address */
	char sa_data[14];			
};
struct sockaddr_in {
	__kernel_sa_family_t sin_family;   // 地址族协议 		
	__be16 sin_port;	// 端口
	struct in_addr sin_addr;   // IP地址				
	unsigned char __pad[__SOCK_SIZE__ - sizeof(short int) - sizeof(unsigned short int) - sizeof(struct in_addr)];
};
struct in_addr {
	__be32 s_addr;
};

IPv4地址用socketaddr_in结构体表示,包括16位端口号和32位IP地址,IPv6地址用socketaddr_in6结构体表示,包括16位端口号、128位IP地址和一些控制字段。

6. 网络套接字函数

(1) 创建套接字

int socket(int domain, int type, int protocol);
  • 创建一个套接字
  • domin
    • AF_INET:这是大多数用来产生socket的协议,使用TCP或UDP来传输,使用IPv4的地址;
    • AF_INET6:使用IPv6的地址;
    • AF_UNIX:本地协议,使用在Unix和Linux系统上,一般都是当客户端和服务器端都在同一台机器上的时候使用;
  • type
    • SOCK_STREAM:流式协议,这个协议是按照顺序的、可靠的、数据类型完整的、基于字节流的连接。这是一个使用最多的socket类型,这个socket是使用TCP来进行传输的;
    • SOCK_DGRAM:报式协议,这个协议式无连接的、固定长度的传输调用,该协议是不可靠的,使用UDP进行传输;
    • SOCK_SEQPACKET:该协议是双线路的、可靠的连接,发送固定长度的数据包进行传输,必须把这个包完整的接收才能进行读取;
    • SOCK_RAW:socket类型提供单一的网络访问,这个socket类型使用ICMP公共协议,ping以及traceroute都使用该协议;
    • SOCK_RDM:这个类型使用较少,在大部分操作系统上没有实现,它提供给数据链路层使用,不保证数据包的顺序;
  • protocol:设置0表示使用默认协议; 协议,常见的协议有IPPROTO_TCP、IPPTOTO_UDP、 IPPROTO_SCTP、IPPROTO_TIPC他们分别对应这TCP传输协议、UDP传输协议、STCP传输协议、TIPC传输协议。当protocol为0时,会自动选择type类型对应的默认协议;
  • 返回值为文件描述符(套接字),即创建好的socket套接字的文件描述符。On success, a file descriptor for the new socket is returned. On error, -1 is returned, and errno is set appropriately.

(2) 绑定

int bind(int sockfd, const struct sockaddr* addr, socklen_t addrlen);
  • 将本地的IP和端口号与创建出来的套接字绑定,将参数sockfd和addr绑定在一起,使sockfd这个用于网络通讯的文件描述符监听addr所描述的地址和端口号。
  • sockfd:创建出的文件描述符
  • addr:端口和IP
  • addrlen:addr结构体的长度,sizeof(addr)

(3) 监听

int listen(int sockfd, int backlog);
  • 设置同时连接到服务器的客户端的个数,listen()声明sockfd处于监听状态,并且最多允许有backlog个客户端处于连接等待状态,如果接收到更多的连接请求就忽略。
  • sockfd:socket函数创建出来的文件描述符;
  • backlog:同时能连接的最大数量,最大值为128;

(4) 接受连接

int accept(int sockfd, struct sockaddr* addr, socklen_t* addrlen);
  • 阻塞等待客户端连接请求,并接受连接。
  • sockfd:文件描述符,使用socket创建出来的文件描述符;
    • 监听的文件描述符;
  • addr:存储客户端的端口和IP,是一个传出参数;
  • addrlen:传入传出参数(值 - 结果),传入sizeof(addr)的大小,函数返回时返回真正接收到地址结构体的大小;
  • 函数返回值是一个套接字,对应客户端,服务器端与客户端进程通信使用accept的返回值对应的套接字。

(5) 连接

int connect(int sockfd, const struct sockaddr* addr, socklen_t addrlen);
  • 客户端需要调用connect()函数连接服务器,connect和bind的参数形式一致,区别在于bind的参数是自己的地址,而connect的参数是对方的地址。
  • sockfd:套接字;
  • addr:传入参数,指定服务器端地址信息,服务器端的IP和端口;
  • addrlen:第二个参数addr的长度;

7. TCP通信流程图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CMangJmQ-1672383966903)(Typora_picture_reference/1660475738627.png)]


在这里插入图片描述
在这里插入图片描述


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

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

相关文章

【答学员问】服务器上安装好LAMP架构,部署wordpress之后网页端无法访问

文章目录问题反馈问题排查1. 首先是IP&#xff1a; 确认无误&#xff1a;2. 安装一下 php看看是否安装&#xff1a;3. 最后测试PHP是否能够解析再次沟通分析整理列清单排查测试过程1. 上传包解压2. 安装好LAMP架构并测试是否支持php3. 测试是否可以访问wordpress4. 查看日志排查…

Maven是怎么样构建Spring Boot项目的?

准备好项目运行所需的环境后&#xff0c;就可以使用IDEA开发工具搭建一个Spring Boot入门程序了。我们既可以使用Maven方式构建项目&#xff0c;也可以使用Spring Initializr快捷方式构建项目。这里先介绍如何使用Maven方式构建Spring Boot项目&#xff0c;具体步骤如下。 1.初…

SpringBoot+VUE前后端分离项目学习笔记 - 【06 SpringBoot集成Mybatis实现数据查询】

配置文件改成yaml格式&#xff1a; application.yml server:port: 9090spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/joyce?serverTimezoneGMT%2b8username: rootpassword: 123456写基本的功能来验证后台数据查询功能 …

了解初级测试人员从测试自动化开始需要什么?

文章目录 前言 将测试自动化视为软件开发 选择一种编程语言开始 学习干净的代码实践和原则 了解自动化中有用的设计模式 学习干净的代码实践和原则 学习网络工作原理的基础知识 选择一个 UI 自动化工具开始 了解 HTTP 协议以及如何自动化 API 测试 熟悉数据库基础知识…

React 配置文件(三)配置本地IP地址和端口号

1.在环境变量中配置好对应IP地址和端口号,拿UAT来举例 2.在config-overrides.js中配置域名和端口号 3.在package.json中配置好启动脚本 "scripts": { "start": "react-app-rewired start", "uat": "dotenv -e .env.uat react-app…

Android之蚂蚁森林能量水滴效果

最近公司有个需求&#xff0c;需要一个类似于蚂蚁森林能量水滴浮动效果&#xff0c;所以有了这篇文章&#xff0c;目前在项目里&#xff0c;没时间提出来做demo&#xff0c;有代码欠缺的地方欢迎指出&#xff0c;一定补上。 文章目录一&#xff1a;效果图二&#xff1a;具体实现…

HotPDF Delphi PDF VCL完全形成PDF文档

HotPDF Delphi PDF VCL完全形成PDF文档 HotPDF Delphi PDF&#xff0c;用于创建和创建PDF文档的应用程序名称。您的公司已在您之前发布&#xff0c;以便在Delphi和C中使用。事实上&#xff0c;使用这个库&#xff0c;您将能够以不同的方式编辑、执行、构建和管理PDF文档。如果您…

configmap中data变成字符串问题(k8s踩坑)

发现问题 编写text文件&#xff0c;用于创建要给nginx的configmap&#xff0c;如下&#xff1a; [rootmaster redis]# vim txt apiVersion: v1 kind: ConfigMap metadata:name: nginx-confignamespace: redis data:nginx.conf: |#user nginx;worker_processes 1;#error_log…

【pandas】教程:4-显示数据

Pandas 显示数据 本节使用的数据为 data/air_quality_no2.csv&#xff0c;链接为 pandas案例和教程所使用的数据-机器学习文档类资源-CSDN文库 import pandas as pd import matplotlib.pyplot as pltair_quality pd.read_csv("data/air_quality_no2.csv", index_co…

知物由学 | SO VMP 加壳与混淆,为移动应用提供函数级保护

导读&#xff1a;VMP 是一种用于软件保护的软件&#xff0c;对软件进行加壳&#xff0c;加固厂商都有自己的 VMP 方案&#xff0c;但值得注意的是&#xff0c;native 层的 VMP 方案并不成熟&#xff0c;兼容性只是其中一个影响因素&#xff0c;性能更是导致该方案无法普及的重要…

2022年广西最新建筑八大员(材料员)模拟真题及答案

百分百题库提供建筑八大员&#xff08;材料员&#xff09;考试试题、建筑八大员&#xff08;材料员&#xff09;考试预测题、建筑八大员&#xff08;材料员&#xff09;考试真题、建筑八大员&#xff08;材料员&#xff09;证考试题库等,提供在线做题刷题&#xff0c;在线模拟考…

C++仍然是2023年值得学习的好语言吗?

如今所有学习C的人都不得不面临一个问题&#xff0c;即C已经大大失去了它受欢迎程度。它同时被三种编程语言所取代 - python&#xff0c;Java和JavaScript。这就引出了一个问题&#xff0c;2023年是否还值得学习C&#xff1f; 如果您学习C是为了在IT领域工作&#xff0c;那么学…

系分 - 软件工程

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 系分 - 软件工程 考点摘要 信息/软件系统的生命周期&#xff08;★★&#xff09;软件开发方法&#xff08;★★★&#xff09;软件开发模型&#xff08;★★★★&#xff09;逆向工程&#xff08;★&#xff09…

一步一步改写Observer观察者模式

简单的概述&#xff1a; Observer模式是建立一个一&#xff08;Subject&#xff09;对多&#xff08;Observer&#xff09;的依赖关系&#xff0c;并且做到当“一”变化的时候&#xff0c;依赖这个“一”的多也能够同步自动改变。 Observer的结构&#xff1a; Subject相当于…

H5 拖动排序 美食排行榜

尝试写一下拖动元素进行排序&#xff0c;真是想到什么去写什么 &#x1f602;&#xff0c;有的时候很多人老是跟我说&#xff0c;别人都封装好了&#xff0c;你为什么还要自己去实现一下&#xff0c;写的还没别人好。但我总感觉所有都用别人写好的&#xff0c;就放弃思考的机会…

linux的CPU使用率达到100%的快速定位方式

一.问题现象 Linux服务器&#xff08;操作系统版本是centos7.9&#xff09;上面部署了若干Java站点服务,突然收到运维的CPU异常g告警&#xff0c;到了影响业务的情况发生&#xff0c;经初步排查&#xff0c;未出现异常进程&#xff0c;排除挖矿病毒的原因。 二.排查思路 &am…

[Verilog]Verilog经典电路设计(一)

Verilog经典电路设计&#xff08;一&#xff09; 1.1 8位移位寄存器 module shifter (din , clk, clr, dout) ; input din, clk, clr; output [7:0] dout; reg [7:0] dout_data;always (posedge clk) begin if (!clr) dout_data < 8b0; //同步清 &#xff0c;高电平…

第二证券|美国巨头向欧盟宣战,暴跌25%,芯片大国告急

“暴利税”完全激怒美国动力巨子。 3万亿美国巨子直接将欧盟告上法庭&#xff0c;当地时间12月28日&#xff0c;埃克森美孚公司正式申述欧盟&#xff0c;要求其撤销对石油集团征收的一项新“暴利税”。该公司表明&#xff0c;欧盟方面征收“暴利税”的行为超出了法律权限。别的…

蓝牙学习八(配对与绑定)

1.简介 Paring&#xff08;配对&#xff09;和Bonding&#xff08;绑定&#xff09;是实现蓝牙射频通信安全的一种机制&#xff0c;有两点需要注意&#xff1a; Paring/bonding实现的是蓝牙链路层的安全&#xff0c;对应用层来说是完全透明的。也就是说&#xff0c;不管有没有…

GitHub入门指南(下)

三、新手必备的GitHub基本操作 1.配置SSH Key (1) 第一次使用时&#xff0c;要配置一下账户。 在 Git Bash 客户端&#xff0c;输入&#xff1a; git config --global user.name “这里输入你在GitHub的账户名” git config --global user.email “这里输入你在GitHub的注册邮…