Linux_socket编程

news2025/1/11 9:50:38
  • 套接字通信
  • 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  失败返回-1
    if (sid < 0)
    {
        exit(1);
    }

    // 调用chdir()更改路径

    // 特殊处理0 1 2
    int fd = open("/dev/null", O_RDWR);
    if (fd == -1)
    {
        exit(2);
    }
    dup2(fd, 0);
    dup2(fd, 1);
    dup2(fd, 2);

    close(fd);
}

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

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

相关文章

stm32-编码器测速

一、编码器简介 编码电机 旋转编码器 A,B相分别接通道一和二的引脚&#xff0c;VCC&#xff0c;GND接单片机VCC&#xff0c;GND 二、正交编码器工作原理 以前的代码是通过触发外部中断&#xff0c;然后在中断函数里手动进行计次。使用编码器接口的好处就是节约软件资源。对于频…

QT下跨平台库实现及移植经验分享

最近在移植公司一个QT桌面软件到android上&#xff0c;有一些公司自定义的库&#xff0c;用了很多windows的api&#xff0c;移植过程很是曲折&#xff0c;在此有一些感悟分享一下~ 一.自编写跨平台库 1.有时候为了程序给第三方用需要编译一些qt封装库&#xff0c;并可能跨平台…

思科防火墙如何进行ACL操作

环境&#xff1a; 思科防火墙ASA5555 Cisco Adaptive Security Appliance Software Version 9.4(2)6 Device Manager Version 7.5(2)153 问题描述&#xff1a; 思科防火墙如何进行ACL操作 解决方案&#xff1a; 进入en模式 1.查看现有全部list show running-config | i…

stm32-定时器输出比较PWM

目录 一、输出比较简介 二、PWM简介 三、输出比较模式实现 1.输出比较框图(以通用定时器为例) 2.PWM基本结构 四、固件库实现 1.程序1&#xff1a;PWM呼吸灯 2.程序2&#xff1a;PWM驱动直流电机 3.程序3&#xff1a;控制舵机 一、输出比较简介 死区生成和互补输出一般…

Tomcat Session集群---会话绑定

实验配置&#xff1a; 7-1安装Nginx 7-2和7-3安装Tomcat 1.配置7-1 1.做负载均衡&#xff0c;反向代理 [rootlocalhost ~]# vim /etc/nginx/nginx.conf17 http {18 upstream tomcat {19 server 192.168.91.102:8080;20 server 192.168.91.103:8080;2…

ideaSSM校医院管理网页模式开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 idea ssm 校医院管理系统是一套完善的完整信息管理系统&#xff0c;结合SSM框架完成本系统SpringMVC spring mybatis &#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c; 系统具有完整的源代码和数据…

HarmonyOS应用开发者高级认证答案

** HarmonyOS应用开发者高级认证 ** 以下是高级认证答案&#xff0c;存在个别选项随机顺序答案&#xff0c;自行辨别 判断题 云函数打包完成后&#xff0c;需要到 AppGallery Connect 创建对应函数的触发器才可以在端侧中调用 错 在 column 和 Row 容器组件中&#xff0c;a…

UDF提权

目录 一、UDF概述 二、提权条件 三、漏洞复现 (一) 信息收集 1. Nmap信息收集 1.1、查看当前IP地址 1.2、扫描当前网段&#xff0c;找出目标机器 1.3、快速扫描目标机全端口 2. dirb目录扫描 3. 第一个flag 3.1、目录遍历漏洞 3.2、flag 4. 敏感信息利用 (二) 漏…

Hive-技术补充-初识ANTLR

一、背景 要清晰的理解一条Hql是如何编译成MapReduce任务的&#xff0c;就必须要学习ANTLR。下面是ANTLR的官方网址&#xff0c;下面让我们一起来跟着官网学习吧&#xff0c;在学习的过程中我参考了《antlr4权威指南》&#xff0c;你也可以读下这本书&#xff0c;一定会对你有…

labview技术交流-判断两个数组的元素是否完全相同

问题来源 分析并判断两个一维数组中包含的元素是否完全相同&#xff0c;不考虑索引顺序。比如说[1,5,7,3]和[3,5,7,1]是完全相同的两个一维数组&#xff0c;那[1,5,7,3]和[5,7,1,4]就不是相同的数组。结合我给出的示例&#xff0c;大家有没有什么思路呢&#xff1f; 思路分析 …

Java数据结构-优先级队列

文章目录 前言一、优先级队列1.1 概念 二、优先级队列的模拟实现2.1 堆的概念2.2 堆的存储方式2.3 堆的创建2.3.1 堆向下调整2.3.2 堆的创建2.3.3 建堆的时间复杂度 2.4 堆的插入与删除2.4.1 堆的插入2.4.2 堆的删除 2.5 用堆模拟实现优先级队列 三、常用接口介绍3.1 PriorityQ…

MediaBox音视频终端SDK已适配鸿蒙星河版(HarmonyOS NEXT)

2024年1月&#xff0c;HarmonyOS NEXT 鸿蒙星河版系统开发者预览版开放申请&#xff0c;该系统将只能安装为鸿蒙开发的原生应用&#xff0c;而不再兼容安卓应用。对此&#xff0c;阿里云MediaBox音视频终端SDK产品已实现功能的鸿蒙化迁移和重构&#xff0c;全面适配鸿蒙系统Har…

Html提高——HTML5 新增的语义化标签

引入&#xff1a; 以前布局&#xff0c;我们基本用 div 来做。div 对于搜索引擎来说&#xff0c;是没有语义的。 但是在html5里增加了语义化标签&#xff0c;如 <header>&#xff1a;头部标签 <nav>&#xff1a;导航标签 <article>&#xff1a;内容标签 &…

ASP.NET Mvc+FFmpeg+Video实现视频转码

目录 首先&#xff0c;做了视频上传的页面&#xff1a; FFmpeg&#xff1a;视频转码 FFmpegHelper工作类&#xff1a; 后台控制器代码&#xff1a; 前端视图代码&#xff1a; 参考文章&#xff1a; 首先&#xff0c;做了视频上传的页面&#xff1a; 借鉴了这篇文章 ASP.…

Qt学习--this指针的使用

在 C 中&#xff0c;this 指针是一个特殊的指针&#xff0c;它指向当前对象的实例。 在 C 中&#xff0c;每一个对象都能通过 this 指针来访问自己的地址。 this是一个隐藏的指针&#xff0c;可以在类的成员函数中使用&#xff0c;它可以用来指向调用对象。 当一个对象的成员…

【算法杂货铺】二分算法

目录 &#x1f308;前言&#x1f308; &#x1f4c1; 朴素二分查找 &#x1f4c2; 朴素二分模板 &#x1f4c1; 查找区间端点处 细节&#xff08;重要&#xff09; &#x1f4c2; 区间左端点处模板 &#x1f4c2; 区间右端点处模板 &#x1f4c1; 习题 1. 35. 搜索插入位…

实验01 ASP.NET网站的建立及运行

【实验目的】 &#xff08;1&#xff09;能熟悉ASP.NET的开发环境Visual Studio Community 2019&#xff08;VSC 2019&#xff09;。 &#xff08;2&#xff09;能通过解决方案管理网站&#xff0c;会在解决方案中创建网站。 &#xff08;3&#xff09;会设置IIS 10中的网站…

德迅蜂巢(容器安全)全面出击

随着云计算的发展&#xff0c;以容器和微服务为代表的云原生技术&#xff0c;受到了人们的广泛关注&#xff0c;德迅云安全德迅蜂巢&#xff08;容器安全&#xff09;是企业容器运行时和容器编排的首要选择。然而&#xff0c;在应用容器过程中&#xff0c;大多数企业都遇到过不…

VS2022 配置QT5.9.9

QT安装 下载地址&#xff1a;https://download.qt.io/archive/qt/ 下载安装后进行配置 无法运行 rc.exe 下载VS2022 官网下载 配置 1.扩展-管理扩展-下载Qt Visual Studio Tools 安装 2.安装完成后&#xff0c;打开vs2022,点击扩展&#xff0c;会发现多出了QT VS Tools,点…

应用层_HTTPHTTPS

在应用层中&#xff0c;协议一般是程序员定制的&#xff0c;但现在已经有了许多非常好用的协议&#xff0c;我们可以直接参考使用。其中http和https便是其中最常用的协议之一。 一.HTTP 超文本传输协议&#xff08;Hypertext Transfer Protocol&#xff0c;HTTP&#xff09;…