Linux_socket编程

  • 套接字通信
  • socket 接口
  • 守护进程

一.套接字通信

端口号:

  • 端口号是一个2字节16位的整数;
  • 端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理;

一台主机可以根据ip地址定位另一台主机,而两台主机之间的通信本质是进程在通信。根据ip地址我们可以定位一台主机,而根据端口号(port)可以定位一台主机上的一个进程。这样世界上任何一个进程都可以通过IP地址+端口号来定位。【源ip+源port ----》 目的ip+目的port】这样的通信方式称为套接字通信。
采用端口号而不是pid来标识进程的原因是降低网络和进程管理的耦合度,同时也更好的区分了网络进程。一个端口号只能对应一个进程,但是一个进程可以对应多个端口号。
套接字通信主要编写的是应用层的程序,使用os提供的网络部分的系统调用进行发送和接收消息。

二.socket 接口

udp协议特点:

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

tcp协议特点:

  • 有连接
  • 可靠传输
  • 面向字节流
2.1 udp协议相关的接口
  1. 创建socket文件

image.png

  • 返回值:返回一个文件描述符,后续输入输出操作文件描述符
  • domain:由于套接字通信可以进行网络通信,也可以进行本地通信,因此这个参数用来确定通信域
    • AF_INET:网络通信
    • AF_UNIX:本地通信
  • type:表示通信类别是面向字节流还是面向数据报
    • SOCK_DGRAM: 面向数据报
    • SOCK_STREAM:面向字节流
  • protocol:默认0即可,os会自动根据type来确定协议是tcp还是udp
  1. 绑定socket

image.png

  • 返回值:bind成功返回0,失败返回-1
  • sockfd:socket文件描述符
  • addrlen:addr对象的实际大小
  • addr:将端口号和ip地址 与当前进程绑定

image.png
addr中实际传入的对象是sockadd_in或者sockaddr_un,封装为sockaddr只是为了统一参数类型。因为传入的参数类型为sockaddr,所以需要根据首部16位来确定真实的参数类型。

  • 如果传入的参数是sockaddr_in 实例化后的对象,那么表示为网络通信,需要指明ip地址和端口号
    • 由于通信双方的字节序(大端/小端)有可能不同,所以网络中规定,发送到网络的数据都以大端方式存储。转换函数库中已经提供
    • uint32_t htonl(uint32_t hostlong) 将32位主机序列转换位32位网络序列
    • uint32_t ntohl(uint32_t netlong) 将32位网络序列转换位32位主机序列
    • uint16_t ntohs(uint16_t netlong)
    • uint16_t htons(uint16_t hostlong)
    • 其中h:host主机 n:net网络 l:long s:short
  • 如果传入的参数是sockaddr_un 实例化后的对象,那么表示为本地通信

sockaddr_in 在头文件netinet/in.h 和 arpa/inet.h 中

注意:

  • 服务器绑定的ip地址最好由os决定:使用INADDR_ANY填入参数
  • 客户端的绑定由os在合适的时候完成,程序员不需要自己绑定,防止出现端口冲突问题。
  1. 接收消息

image.png

  • 返回值:成功返回读取到的字节数,失败返回-1
  • sockfd:文件描述符
  • buf:要接收数据的缓存区
  • len:要接收数据的长度
  • flags:设置为0即可
  • src_addr:输出型参数,会设置为发送方的ip地址和端口号
  • addrlen:src_addr指针指向对象的长度,一定要初始化
  1. 发送消息

image.png

  • sockfd:文件描述符
  • buf:发送数据缓存区
  • len:发送数据缓冲区的大小
  • dest_addr:填写对端的ip地址和端口号
  • addrlen:dest_addr所指向对象的大小
2.2 tcp协议相关的接口
  1. 创建socket文件-同上
  2. 绑定socket-同上
  3. 监听listen

image.png

  • 功能:将sockfd文件设置为监听状态,使之有能力接收来自客户端的连接
  • sockfd:要设置为监听状态的文件描述符
  • backlog:tcp协议在底层维护的全连接队列,最大长度是:backlog+1,如果全连接队列满了,其他到来的连接会在半连接队列中,这个值不能大,否则会导致客户端长时间得不到响应,降低用户体验
  • 返回值:成功返回0,失败-1
  1. accept服务器接收连接

image.png

  • 如果服务器成功接收来自客户端的连接,那么将创建一个socket文件用于和这个客户端传输数据
  • 返回值:返回一个新建的socket文件描述符
  • sockfd:传入调用socket()函数创建的监听套接字文件描述符 ,这两个文件描述符的作用不同,一个是为了接收来自客户端的连接,一个是与客户端进行传输数据
  • addr:保存的是客户端的ip地址+port
  • addrlen:addr指向对象的实际大小
  1. connet客户端发起连接

image.png

  • 返回值:成功返回0,失败返回-1
  • sockfd:客户端创建的socket文件描述符
  • addr:传入要连接的服务器的ip地址和端口号
  • addrlen:addr指向对象的大小
  1. 读数据/写数据

image.png
image.png

  • 由于tcp协议是面向字节流的,所以可以用文件的接口进行读写

三.守护进程

在linux中,使用ps axj可以查看运行中的进程信息。在命令行中输入sleep 1000 | sleep 100000 | sleep 2000 & 然后使用ps axj | head -1 && ps axj | grep sleep查看sleep进程的信息。

image.png
  • PPID:当前进程的父进程的id
  • PID:当前进程的id
  • PGID:进程组id, 一条指令对应一个进程组。比如:前面3个 sleep 在一条指令中,所以这三个进程为一个组,PGID为进程组的组长id
  • SID:会话id,在xshell中,一个输入框对应一个会话,下面为两个会话窗口
  • image.png
  • TTY:终端,一个会话对应一个终端,程序的打印结果是输出到终端上的。

会话,进程组,进程的关系:
一个会话内有许多进程组,一个进程组内有许多进程。
image.png
如果我们关闭一个会话,那么会话内部的进程将全部退出。众所周知,服务器是需要一直运行的,所以服务器不能用用户进行命令行解释的会话来运行,而需要单独成一个会话,这个会话不能轻易退出。单独成一个会话的进程叫做守护进程。
守护进程需要满足的条件:

  1. 不能是原来进程组的组长
  2. 进程路径可能会更改
  3. 文件描述符0 1 2 需要特殊处理,重定向到/dev/null 文件
  4. 需要忽略一些信号
  5. 需要调用setsid()创建会话

代码模拟:
凡是调用该函数的进程都将变为守护进程,除非调用kill,否则不会退出。

void daemon()
{// 特殊处理信号signal(SIGPIPE, SIG_IGN);signal(SIGCHLD, SIG_IGN);// 保证自己不是组长if (fork() > 0)exit(0);// 创建会话pid_t sid = setsid();// 成功返回会话id  失败返回-1if (sid < 0){exit(1);}// 调用chdir()更改路径// 特殊处理0 1 2int fd = open("/dev/null", O_RDWR);if (fd == -1){exit(2);}dup2(fd, 0);dup2(fd, 1);dup2(fd, 2);close(fd);
}

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

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

相关文章

Mybatis(搭建,CRUD,方法参数,XML映射文件,动态SQL)【详解】

目录 一.准备基础代码 Mybatis的通用配置 二. 基本CURD操作 1.查询-根据id查询一条 2.查询-查询数量 3.删除 4.新增 获取主键值 5.修改 6.查询-模糊查询 预编译SQL #{}与${}的区别【面试题】 三. Mybatis的方法参数与结果集 1.SQL里取方法参数的值 2.查询结果集…

固定资产管理系统:井然有序,提升利用率,降损增值的解决之道。

固定资产管理系统是一种用于管理和跟踪组织内固定资产的软件系统。固定资产是指组织长期持有并用于生产、运营或提供服务的资产&#xff0c;例如土地、建筑物、机器设备、车辆等。 固定资产管理系统提供了一种集中管理和监控固定资产的方式&#xff0c;帮助组织更好地管理其资产…

人工智能 安装GPU环境 windows版

准备工作 需要有NVIDIA账号 磁盘要有50G 空间 我这里是 aws的 G4dn 虚拟机, 对应的 Tesla显卡,操作系统windows2022 1,安装VS 用社区版2019即可 https://my.visualstudio.com/Downloads?PId8228 2,下载完后运行程序选择C桌面版 大概5-10个G 3,下载完后运行一下 有账号就输…

房天下登录接口JS逆向

声明 本文章中所有内容仅供学习交流&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;若有侵权&#xff0c;请联系我立即删除&#xff01; 逆向目标 目标&#xff1a;房天下账号密码登录 主页&#xff1a;https://passport.…

HarmonyOS NEXT应用开发—自定义日历选择器

介绍 本示例介绍通过CustomDialogController类显示自定义日历选择器。 效果图预览 使用说明 加载完成后显示主界面&#xff0c;点当前日期后会弹出日历选择器&#xff0c;选择日期后会关闭弹窗&#xff0c;主页面日期会变成选定的日期。 实现思路 获取当前月和下个月的日期…

WIFI 7技术的应用前景

随着WIFI 7技术的不断成熟和普及&#xff08;如果对WIFI 7技术不太了解的&#xff0c;可以点击链接去查看一下这篇文章WIFI7&#xff1a;开启无线通信新纪元 &#xff09;&#xff0c;我们正迎来一个数字连接的全新时代。WIFI 7作为新一代无线网络标准&#xff0c;将极大的改变…

Selenium 是什么?简单了解Selenium

Selenium Selenium 是什么 Selenium 是一款 Web UI 测试工具&#xff0c;是一款 自动化测试 工具&#xff0c;使用 Selenium 测试工具进行的测试通常被称为 Selenium Testing&#xff0c;各种支持如下列表&#xff1a; UI 元素的支持与管理&#xff1a;自写代码实现浏览器支…

【Qt】用Qt开发需要购买授权吗?——关于(L)GPL证书的详解

目录 Qt证书体系开源证书解读Qt官方对(L)GPL的描述自由度要求 GPL vs. LGPL完整条款 总结参考 Qt证书体系 你在用Qt开发应用的过程中&#xff0c;是否也担心过授权问题&#xff1f; 按照官方说法 The Qt framework is dual-licensed, available under both commercial and op…

Leetcode 3.15

Leetcode hot100 二叉树1.二叉搜索树中第K小的元素2.二叉树展开为链表3.从前序与中序遍历序列构造二叉树 二叉树 1.二叉搜索树中第K小的元素 二叉搜索树中第K小的元素 最重要的知识点&#xff1a;二叉树搜索树的中序遍历是升序的。 方法一&#xff1a;我们只需存储升序遍历&…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:ListItemGroup)

该组件用来展示列表item分组&#xff0c;宽度默认充满List组件&#xff0c;必须配合List组件来使用。 说明&#xff1a; 该组件从API Version 9开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。该组件的父组件只能是List。 使用说明 当List…

Docker使用(四)Docker常见问题分析和解决收集整理

Docker使用(四)Docker常见问题分析和解决收集整理 五、常见问题 1、 启动异常 【描述】&#xff1a; 【分析】&#xff1a;[rootlocalhost ~]# systemctl status docker 【解决】&#xff1a; &#xff08;1&#xff09;卸载后重新安装&#xff0c;不能解决这个问题。 …

Android cmdline tools安装

打开AS 进入SDK Tools 看到了吗?那个打着勾的就是

如何将图片无损放大?

如何将图片无损放大&#xff1f; 在处理图片时&#xff0c;我们经常会遇到需要放大图像而又不损失图像质量的情况。这种操作被称为“图片无损放大”&#xff0c;它可以帮助我们保持图像的清晰度和细节&#xff0c;同时满足对更大尺寸图像的需求。传统的图像放大方法往往会导致…

重要表格比较多 不想被别人查阅 怎样批量加密?excel批量加密

批量给Excel工作表加密是一个既实用又具挑战性的任务。对于需要在多个工作表中保护敏感信息的用户来说&#xff0c;掌握这一技能尤为重要。下面&#xff0c;我们将详细介绍如何批量给Excel工作表加密 首先&#xff0c;我们要选择合适的加密方法&#xff0c;在这里小编给大家推荐…

Spring MVC(一)— DispatcherServlet

DispatcherServlet 是Spring MVC框架的HTTP 请求处理器的中央调度器。它具有以下的功能&#xff1a; 1&#xff09;基于IoC容器JavaBean配置机制。 2&#xff09;使用HandlerMappingl来实现请求到处理器的路由映射。 3&#xff09;使用HandlerAdapter 来处理不同的处理器。 …

【自动驾驶可视化工具】

自动驾驶可视化工具 自动驾驶可视化工具1.百度Apollo的Dreamview:2.Cruise的Worldview:3.Uber的AVS:4.Fglovex Studio: 自动驾驶可视化工具 介绍一下当前主流的自动驾驶可视化工具。 1.百度Apollo的Dreamview: Dreamview是百度Apollo平台开发的一种可视化工具&#xff0c;用…

使用Spark清洗统计业务数据并保存到数据库中

1、打开前面创建的项目“BigData-Etl-KongGuan”&#xff0c;创建一些数据库访问的工具类和辅助类。 1&#xff09;打开SpringBoot项目&#xff1a;BigData-Etl-KongGuan 2&#xff09;创建数据库访问的工具类和辅助类&#xff1a; com.qrsoft.etl.dao.IBaseDao数据库访问的通…

基于正点原子潘多拉STM32L496开发板的简易示波器

一、前言 由于需要对ADC采样性能的评估&#xff0c;重点在于对原波形的拟合性能。 考虑到数据的直观性&#xff0c;本来计划采集后使用串口导出&#xff0c;并用图形做数据拟合&#xff0c;但是这样做的效率低下&#xff0c;不符合实时观察的需要&#xff0c;于是将开发板的屏幕…

部署prometheus+Grafana可视化仪表盘监控服务

一、部署prometheus及监控仪表盘 简介 Prometheus是开源监控报警系统和时序列数据库(TSDB)。 Prometheus的基本原理是通过HTTP协议周期性抓取被监控组件的状态&#xff0c;任意组件只要提供对应的HTTP接口就可以接入监控&#xff0c;输出被监控组件信息的HTTP接口被叫做expo…

Node.js(1)

跨平台的node.js运行环境&#xff0c;使开发者可以搭建服务器端的js应用程序 它可以编写服务器端程序&#xff1b; 编写数据接口&#xff1b;提供网页资源浏览功能 前端工程化&#xff1a;开发集成的所有工具和技术 与浏览器环境的区别 node.js环境中没有DOM和BOM fs模块-读…