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.hqwc.cn/news/542135.html

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

相关文章

Java安全 CC链2分析

Java安全 CC链2分析 cc链2介绍前置知识环境配置类加载机制 触发流程cc链2POCcc链2分析 cc链2介绍 CC2链适用于Apache common collection 4.0版本&#xff0c;由于该版本对AnnotationInvocationHandler类的readObject方法进行了修复&#xff0c;导致cc链1无法使用&#xff0c;故…

基于Java+SpringMVC+vue+element宠物管理系统设计实现

基于JavaSpringMVCvueelement宠物管理系统设计实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末获取源…

ASP.NET-Server.UrlEncode

目录 背景: Server.UrlEncode作用: 1.URL 编码&#xff1a; 2.避免冲突&#xff1a; 3.安全性&#xff1a; 4.规范化&#xff1a; 实例说明: 不使用Server.UrlEncode 使用Server.UrlEncode 总结: 背景: Server.UrlEncode方法在ASP.NET中主要功能是对URL中的参数进行编…

十三、BERT

BERT&#xff08;Bidirectional Encoder Representation from Transformers&#xff09;&#xff0c;基于 Transformer 的双向编码表示&#xff0c;模型训练时的两个任务是预测句子中被掩盖的词以及判断输入的两个句子是不是上下句。 论文中介绍了2种版本&#xff1a;BERT_BASE…

基于SpringBoot和Echarts的全国地震可视化分析实战

目录 前言 一、后台数据服务设计 1、数据库查询 2、模型层对象设计 3、业务层和控制层设计 二、Echarts前端配置 1、地图的展示 2、次数排名统计 三、最终结果展示 1、地图展示 2、图表展示 总结 前言 在之前的博客中基于SpringBoot和PotsGIS的各省地震震发可视化分…

鸿蒙车载原生开发,拓展新版图

一天内连发“五弹”、HiCar 4.0首次上车 华为鸿蒙狂扩“汽车朋友圈”-上游新闻 汇聚向上的力量 3月15日&#xff0c;在“华为云&华为终端云服务创新峰会2024”上&#xff0c;华为首批汽车行业伙伴广汽传祺、岚图汽车、零跑汽车、凯翼汽车加入鸿蒙生态合作&#xff0c;华为…

SHELL——条件判断语句练习

目录 一、练习题目 二、解答过程 1、判断当前磁盘剩余空间是否有20G&#xff0c;如果小于20G&#xff0c;则将报警邮件发送给管理员&#xff0c;每天检查次磁盘剩余空间。 安装邮件服务 配置邮件服务 编写脚本work1.sh 添加计划任务 2、判断web服务是否运行&#xff1a;…

【Eviews实战】——多元线性回归模型的建立(二)

&#x1f349;CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一&#xff5c;统计学&#xff5c;干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项&#xff0c;参与研究经费10w、40w级横向 文…

wsl中安装虚拟环境virtualenv,pycharm中配置wsl解释器

wsl 中安装虚拟环境 virtualenv 注意&#xff1a; 不能将虚拟环境安装到 /root 目录下&#xff0c;在 window 文件管理中&#xff0c;没有权限访问 wsl 中的 /root 目录 安装虚拟环境 sudo pip install virtualenv sudo pip install virtualenvwrapper配置环境变量 1、创建…

html5的css使用display: flex进行div居中的坑!

最近做项目的时候&#xff0c;有个需求&#xff0c;一个高度宽度不确定的Div在另一个Div内上下左右居中。 然后以前上下居中用的都是很繁琐的&#xff0c;就打算去百度搜索一个更优秀的方法。 百度AI自己给我一个例子&#xff1a; /* div在容器里居中显示&#xff0c;设置外容…

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…

移动云COCA架构实现算力跃升,探索人工智能新未来

近期&#xff0c;随着OpenAI正式发布首款文生视频模型Sora&#xff0c;标志着人工智能大模型在视频生成领域有了重大飞跃。Sora模型不仅能够生成逼真的视频内容&#xff0c;还能够模拟物理世界中的物体运动与交互&#xff0c;其核心在于其能够处理和生成具有复杂动态与空间关系…