Linux 秋招必知必会(六、Socket 网络编程)

news2024/11/20 21:26:28

二、Socket 编程

13. 什么是 Socket?

  • Socket 本身有 “插座” 的意思,在 Linux 环境下,用于表示进程间网络通信的特殊文件类型
    • 本质为内核借助缓冲区形成的伪文件
  • 既然是文件,那么可以使用文件描述符引用套接字
    • 与管道类似,Linux 系统将其封装成文件是为了统一接口,使得读写套接字和读写文件的操作一致
    • 区别是:管道主要应用于本地进程间通信,而套接字多应用于网络进程间数据的传递
  • 在 TCP/IP 协议中,“IP 地址 + TCP 或 UDP 端口号” 唯一标识网络通信中的一个进程
    • “IP 地址 + 端口号” 就对应一个 socket
    • 欲建立连接的两个进程各自有一个 socket 来标识,那么这两个 socket 组成的 socket pair 就唯一标识一个连接,因此可以用 socket 来描述网络连接的一对一关系
  • 在网络通信中,套接字一定是成对出现的
    • 一个文件描述符指向一个套接字 (该套接字内部由内核借助两个缓冲区实现)

14. 网络字节序

  • 内存中的多字节数据相对于内存地址有大端和小端之分,磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分。网络数据流同样有大端小端之分,那么如何定义网络数据流的地址呢?
    • 发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出,接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存,因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址
  • TCP/IP 协议规定,网络数据流应采用大端字节序,即低地址高字节,而发送主机可能是小端字节序,也可能是大端字节序。为使网络程序具有可移植性,使同样的 C 代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机字节序的转换(PC 机采用小端法,网络采用大端法
    • 如果主机是小端字节序,这些函数将参数做相应的大小端转换后返回,如果主机是大端字节序,这些函数不做转换,将参数原封不动地返回
    #include <arpa/inet.h>
    
    // h 表示 host,n 表示 network,l 表示 32 位长整数,s 表示 16 位短整数
    uint32_t htonl(uint32_t hostlong);    // 本地转网络(IP)
    uint16_t htons(uint16_t hostshort);   // 本地转网络(port) 
    uint32_t ntohl(uint32_t netlong);     // 网络转本地(IP)
    uint16_t ntohs(uint16_t netshort);    // 网络转本地(port)
    

15. Socket 模型创建流程

  • 1 个客户端和 1 个服务器端进行通信:一共有 3 个套接字(一对用于通信的套接字,服务器单独还有一个用于监听的套接字)
    在这里插入图片描述
15.1 socket 函数
// 创建一个套接字
#include <sys/types.h>
#include <sys/socket.h>

int socket(int domain, int type, int protocol);
  • domain

    • AF_INET 这是大多数用来产生 socket 的协议,使用 TCP 或 UDP 来传输,用 IPv4 的地址
    • AF_INET6 与上面类似,不过是用 IPv6 的地址
  • type

    • SOCK_STREAM(流式) 这个协议是按照顺序的、可靠的、数据完整的基于字节流的连接。这是一个使用最多的 socket 类型,这个 socket 使用 TCP 来进行传输
    • SOCK_DGRAM(报式) 这个协议是无连接的、固定长度的传输调用。该协议是不可靠的,使用 UDP 来进行它的连接
  • protocol

    • 传 0 表示使用默认协议
  • 返回值

    • 成功:返回新套接字(socket)对应的文件描述符
    • 失败:返回 -1,设置 errno
15.2 bind 函数
#include <sys/types.h>
#include <sys/socket.h>

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
  • 服务器程序所监听的网络地址和端口号通常是固定不变的,客户端程序得知服务器程序的地址和端口号后就可以向服务器发起连接,因此服务器需要调用 bind 绑定一个固定的网络地址(IP)和端口号(port)到套接字

  • sockfd

    • 指定待绑定的 socket(用于监听的套接字) 文件描述符
  • addr

    • 构造出 IP 地址加端口号
    • 类型是 struct sockaddr *
    /*
        struct sockaddr_in {
            sa_family_t    sin_family; // address family: AF_INET
            in_port_t      sin_port;   // port in network byte order
            struct in_addr sin_addr;   // internet address
        };
        // internet address
        struct in_addr {
            uint32_t       s_addr;     // address in network byte order
        };
    
    */
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(8888);
    // 因为服务器可能有多个网卡,每个网卡也可能绑定多个 IP 地址,这样设置可以在所有的 IP 地址上监听
    // 直到与某个客户端建立了连接时才确定下来到底用哪个 IP 地址
    addr.sin_addr.s_addr = htonl(INADDR_ANY);  // INADDR_ANY 宏:表示取出系统中有效的任意 IP 地址,二进制类
    (struct sockaddr *)&addr // addr 类型为 struct sockaddr*,故此处需要强制转换
    
    • addrlen
      • sizeof(addr) 结构体长度
    • 返回值
      • 成功:返回 0
      • 失败:返回 -1, 设置 errno
15.3 listen 函数
#include <sys/types.h>
#include <sys/socket.h>

int listen(int sockfd, int backlog);
  • listen 函数用于设置同时与服务器建立连接的(监听)上限数 (同时进行 3 次握手的客户端数量)

  • sockfd

    • socket 对应的文件描述符
  • backlog

    • 排队建立 3 次握手队列和刚刚建立 3 次握手队列的链接数和
    • 最大值 128
  • 典型的服务器程序可以同时服务于多个客户端

    • 当有客户端发起连接时,服务器调用的 accept() 返回并接受这个连接
    • 如果有大量的客户端发起连接而服务器来不及处理,尚未 accept 的客户端就处于连接等待状态
    • listen() 声明 sockfd 处于监听状态,并且最多允许有 backlog 个客户端处于连接等待状态,如果接收到更多的连接请求就忽略
    • listen() 成功返回 0,失败返回 -1
15.4 accept 函数
#include <sys/types.h>
#include <sys/socket.h>

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
  • accept 函数用于阻塞(监听)等待客户端建立连接
    • 三方握手完成后,服务器调用 accept() 接受连接,如果服务器调用 accept() 时还没有客户端的连接请求,就阻塞等待直到有客户端连接上来
  • sockdf
    • socket 文件描述符,socket 函数返回值
  • addr
    • 传出参数,返回成功与服务器建立连接的那个客户端的地址结构(含 IP 地址和端口号)
      用于和客户端建立连接的套接字
  • addrlen
    • 传入传出参数
      • 传入:sizeof(addr) 大小
      • 传出:客户端 addr 实际大小
  • 返回值
    • 成功:返回一个新的用于和客户端通信的 socket 对应的文件描述符
    • 失败:返回 -1,设置 errno
15.5 connect 函数
#include <sys/types.h>
#include <sys/socket.h>

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
  • connect 函数作用:使用现有的 socket 与服务器建立连接
    • connect 和 bind 的参数形式一致,区别在于 bind 的参数是自己的地址,而 connect 的参数是对方的地址
    • 如果不使用 bind 绑定客户端地址结构,则系统默认采用 “隐式绑定”
  • sockdf
    • socket 文件描述符
  • addr
    • 传入参数,指定服务器端地址结构(含 IP 地址和端口号)
  • addrlen
    • 传入参数,传入 sizeof(addr) 服务器端地址结构的长度
  • 返回值
    • 成功:返回 0
    • 失败:返回 -1,设置 errno

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

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

相关文章

机器人路径规划:基于Q-learning算法的移动机器人路径规划(可以更改地图,起点,终点),MATLAB代码

一、Q-learning算法 Q-learning算法是强化学习算法中的一种&#xff0c;该算法主要包含&#xff1a;Agent、状态、动作、环境、回报和惩罚。Q-learning算法通过机器人与环境不断地交换信息&#xff0c;来实现自我学习。Q-learning算法中的Q表是机器人与环境交互后的结果&#…

AIGC 探究:人工智能生成内容的技术原理、广泛应用、创新应用、版权问题与未来挑战

AIGC&#xff08;Artificial Intelligence Generated Content&#xff09;即人工智能生成内容&#xff0c;其核心在于利用深度学习技术&#xff0c;尤其是基于神经网络的模型&#xff0c;来模拟人类创作过程&#xff0c;自主生成高质量的文本、图像、音频、视频等各类内容。神经…

MySQL8.0的下载、安装配置教程、连接数据可视图形化界面和卸载及MySQL基本使用教程

文章目录 MySQL8.0下载安装MySQL卸载常见问题解决方式MySQL基本使用教程&#xff08;使用MySQLworkbench&#xff09; 1、创建数据库2、创建表、删除表3、修改表的名字4、为数据表增加、修改、删除字段5、关于修改数据库名字6、拓展&#xff1a;pycharm操作MySQL 首先&#…

Diagrams:Show Me​

大家好&#xff0c;今天给大家介绍的 GPTs 叫 Diagrams:Show Me。 首先&#xff0c;让Diagrams:Show Me介绍一下自己&#xff0c;了解一下他的基本功能 然后&#xff0c;让他告诉我们&#xff0c;我们要怎么与他进行交互。 按照他给出的例子来体验一下他的功能。先来第一个例子…

cog predict docker unknown flag: --file

如图&#xff1a; 使用cog predict -i image“link-to-image” 出现docker unknown flag: --file的问题。 解决方法&#xff08;对我可行&#xff09;&#xff1a;切换cog版本。 这个是我一开始的cog安装命令&#xff08;大概是下的最新版&#xff1f;&#xff09;&#xff1…

StarUML笔记之从UML图生成C++代码

StarUML笔记之从UML图生成C代码 —— 2024-04-14 文章目录 StarUML笔记之从UML图生成C代码1.Add Diagram2.在TOOLBOX中左键点击Class,松开,然后在中间画面再左键点击&#xff0c;即可出现UML3.修改类图&#xff0c;并添加接口&#xff0c;方法&#xff0c;属性&#xff0c;我…

12-LINUX--进程间的通信

进程间通信&#xff1a;采用IPC机制&#xff08;进程间的用户空间相互独立&#xff0c;内核空间共享&#xff09;&#xff0c;有管道&#xff0c;信号量&#xff0c;共享内存&#xff0c;消息队列&#xff0c;套接字。 一.管道 管道可以用来在两个进程之间传递数据&#xff0c…

C语言入门(第三天:函数、指针)

一、函数 1.1 函数概述 作用&#xff1a;提高代码的编写效率&#xff0c;实现对代码的重用 函数使用步骤 定义函数 理解为制作工具&#xff0c;工具只需要制作1次即可 调用函数 理解为使用工具 1.2 无参无返回值 1.3 有参无返回值(重点) 函数参数的作用&#xff1a;增加…

怎么提升公众号上限

正常可以申请多少个公众号&#xff1f;目前如果我们是企业主体的话&#xff08;包括个体户&#xff09;&#xff0c;申请公众号默认是可以申请2个公众号数量的。不过对于很多公司来说&#xff0c;2个公众号的数量肯定是远远不够用的&#xff0c;不同的产品不同品牌不同部门都可…

基于R语言实现的beta二项回归模型【理解与实现】

本实验&#xff0c;创建一组使用二项分布模拟的数据&#xff08;不带额外的随机性&#xff09;&#xff0c;和另一组使用Beta二项分布模拟的数据&#xff08;引入了随机成功概率 p&#xff0c;从而增加了数据的离散性。 现在假设我们站在上帝视角&#xff0c;有两组不知道分布…

【可能是全网最丝滑的LangChain教程】七、LCEL表达式语言

系列文章地址 【可能是全网最丝滑的LangChain教程】一、LangChain介绍-CSDN博客 【可能是全网最丝滑的LangChain教程】二、LangChain安装-CSDN博客 【可能是全网最丝滑的LangChain教程】三、快速入门LLM Chain-CSDN博客 【可能是全网最丝滑的LangChain教程】四、快速入门Re…

Oracle ORA-28547:connection to server failed,probable Oracle Net admin error

使用Navicat连接oracle数据库时报ORA-28547错误 因为Navicat自带的oci.dll并不支持oracle11g&#xff0c;需要去官网下载支持的版本。 1.去oracle下载对应的oci.dll文件 下载地址&#xff1a;Oracle Instant Client Downloads 可以用 11.2.0.4 2. 复制刚下载下来的instant…

【无人机/平衡车/机器人】详解STM32+MPU6050姿态解算—卡尔曼滤波+四元数法+互补滤波(文末附3个算法源码)

效果: MPU6050姿态解算-卡尔曼滤波+四元数+互补滤波 目录 基础知识详解 欧拉角

嵌入式第三天:(C语言入门)

目录 一、跳转关键字 break&#xff1a; continue&#xff1a; goto&#xff1a; 二、函数 概述&#xff1a; 函数的使用&#xff1a; 无参无返回值&#xff1a; 有参无返回值&#xff1a; 有参有返回值&#xff1a; 返回值注意点&#xff1a; 函数的声明&#xff…

微信跳转页面时发生报错

报错如下图所示&#xff1a; 解决方法&#xff1a;&#xff08;从下面四种跳转方式中任选一种&#xff0c;哪种能实现效果就用哪个&#xff09; 带历史回退 wx.navigateTo() //不能跳转到tabbar页面 不带历史回退 wx.redirectTo() //跳转到另一个页面wx.switchTab() //只能…

Linux: softirq 简介

文章目录 1. 前言2. softirq 实现2.1 softirq 初始化2.1.1 注册各类 softirq 处理接口2.1.2 创建 softirq 处理线程 2.2 softirq 的 触发 和 处理2.1.1 softirq 触发2.1.2 softirq 处理2.1.2.1 在 中断上下文 处理 softirq2.1.2.2 在 ksoftirqd 内核线程上下文 处理 softirq 3.…

[lesson26]类的静态成员函数

类的静态成员函数 静态成员函数 在C中可以定义静态成员函数 静态成员函数是类中特殊的成员函数静态成员函数属于整个类所有可以通过类名直接访问公有静态成员函数可以通过对象名访问公有静态成员函数 静态成员函数的定义 直接通过static关键字修饰成员函数 静态成员函数 vs…

4.Godot图片素材的获取和编辑

游戏开发中经常遇到图片素材的需求 1. 图片素材的准备 术语&#xff1a;Sprite 精灵&#xff0c;游戏开发中指一张图片来源不明的图片&#xff0c;切勿在商业用途使用&#xff0c;以免引起版权风险。 1. 在学习阶段&#xff0c;可以百度或者从一些资源网站获取&#xff0c;这…

Unity类银河恶魔城学习记录12-13 p135 Merge Skill Tree with Dogge skill源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili​​​​​​​ Inventory.cs using System.Collections.Generic; using Un…

分布式结构化数据表Bigtable

文章目录 设计动机与目标数据模型行列时间戳 系统架构主服务器Chubby作用子表服务器SSTable结构子表实际组成子表地址组成子表数据存储及读/写操作数据压缩 性能优化局部性群组&#xff08;Locality groups&#xff09;压缩布隆过滤器 Bigtable是Google开发的基于GFS和Chubby的…