Linux网络编程 --- Socket编程

前言

首先看看TCP/IP网络协议和在我们计算机系统层次中的对应关系。

socket的位置

网络通信的本质就是贯穿网络协议层的过程。

局域网数据的封装和解包过程

逻辑上我们认为同层协议之间通信     

几乎任何层的协议都会提供一种解包和分用的功能。

几乎任何层的协议,都要在报头中提供,决定将自己的有效载荷交付给上层的哪个协议。我们称为分用。端口号用来标识上层的服务。这是大部分协议的共性。

以太网通信广播的方式。会有一个协议CSMA/CD。

我们日常网络通信的本质:就是进程间通信!看到同一份资源,就是网络资源。

端口号无论对于客户端还是服务器,都能唯一的标识该主机上的一个网络应用层的进程。
 

在公网上:IP地址能标识唯一的一台主机,端口号port,用来标识该主机上的唯一的一个进程。

IP:Port = 标识全网唯一的一个进程。

[ client_ip:client_port   server_ip server_port]标识了全网唯二的进程。我们ip:port称为socket

端口号 vs 进程pid:

pid已经能够标识一台主机上进程的唯一性了,为什么还要一个端口号 1、不是所有的进程都要网络通信,但是所有的进程都要有pid。2、系统和网络功能的解耦。

一个进程可以绑定多个端口号,一个端口号不可以被多个进程绑定。

网络字节序:

发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出 ;
接收主机把从网络上接到的字节依次保存在接收缓冲区中 , 也是按内存地址从低到高的顺序保存 ;
因此 , 网络数据流的地址应这样规定 : 先发出的数据是低地址 , 后发出的数据是高地址 .
TCP/IP 协议规定 , 网络数据流应采用大端字节序 , 即低地址高字节 .
不管这台主机是大端机还是小端机 , 都会按照这个 TCP/IP 规定的网络字节序来发送 / 接收数据 ;
如果当前发送主机是小端 , 就需要先将数据转成大端 ; 否则就忽略 , 直接发送即可。

网络字节序,主机字节序的相互转换,h代表主机,n代表网络。

套接字的接口:

// 创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器)
int socket(int domain, int type, int protocol);
// 绑定端口号 (TCP/UDP, 服务器) 
int bind(int socket, const struct sockaddr *address,socklen_t address_len);
// 开始监听socket (TCP, 服务器)
int listen(int socket, int backlog);
// 接收请求 (TCP, 服务器)
int accept(int socket, struct sockaddr* address,socklen_t* address_len);
// 建立连接 (TCP, 客户端)
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

套接字编程的种类:

1、域间套接字编程 --- 同一个机器内

2、原始套接字编程 --- 编写一些网络工具

3、网络套接字 --- 用户间的网络通信

想将网络接口统一抽象化

socket套接字里面 sockaddr的结构体

udp服务器

Tcp服务器

这两个代码可以到我的码云上查看

gitee链接

守护进程

前后台进程:键盘信号只能发给前台进程,前台和后台进程都可以向屏幕进行打印,前台进程可以接收键盘的数据,所以谁拥有键盘谁就是前台进程。一个操作系统里面可以有一个前台和多个后台进程

在命令行中,前台进程必须一直存在v 

组长是多个进程中的第一个,进程组和任务是什么关系呢?任务是让进程组完成的。多个任务,在同一个session内启动的sid是一样的 这里的1351就是bash进程号。

每一次登录都会增加一个bash进程,也就是一个会话。

如果不想受用户退出登录的影响,我们可以将进程守护进程化。windows系统中的注销就会把所有的会话都删除。

自成进程组自成会话的进程,守护进程。

如何做到的:

直接将子进程设置成独立的会话,通过fork来进行,接下来我们编写守护进程的代码

#pragma once
#include <iostream>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/fcntl.h>
#include <unistd.h>const std::string nulldictname = "/dev/null";
void Daemon(/*参数问题:这里可以传参,如果传入参数更改当前的工作目录,没有就不要更改,默认就可以*/const std::string& dict = "")
{//首先需要忽略信号//捕捉信号,把他设置成忽略signal(SIGPIPE,SIG_IGN);signal(SIGCLD,SIG_IGN);signal(SIGSTOP,SIG_IGN);//把调用进程设置成独立会话if(fork() > 0) exit(0);  //父进程直接退出,子进程变成孤儿进程,由pid为1的进程托孤//所以守护进程都是孤儿进程setsid();//改变对应的目录if(!dict.empty()) chdir(dict.c_str());//把标准输入输出标准错误重定向到dev/null文件里,该文件相当于windows系统的回收站int fd = open(nulldictname.c_str(),O_RDWR);if(fd > 0){dup2(fd,0);dup2(fd,1);dup2(fd,2);}
}

这里的守护进程系统提供了一个接口,叫做daemon函数。接下来我们使用这个函数

tcp是全双工通信,因为它有两个缓冲区。发送缓冲区和接收缓冲区

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

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

相关文章

FPGA实现SDI视频H265压缩网络推流输出,基于VCU架构,支持12G-SDI 4K60帧,提供工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我这里已有的视频图像编解码方案本博已有的 SDI 编解码方案 3、详细设计方案设计框图FPGA开发板视频输入SDI硬件均衡器LMH1219UHD-SDI GT SDI视频解串SMPTE UHD-SDI RX SUBSYSTEM SDI视频解码Video Frame Buffer WriteZynq UltraS…

Apollo Planning模块中的Hybird A*算法

文章目录 流程图OpenSpacePlanner算法与周边模块关系OpenSpacePlanner与PublicRoadPlanner关系Hybird A*流程Hybird A*外部调用入口Hybird A*内部流程 Hybird A*代码逻辑主函数Plan碰撞检测ReedsShepp曲线加速搜索扩展相邻的节点计算节点的代价路径后处理路径分割轨迹平滑&…

android AccessibilityService合法合规增加小红书曝光阅读量(2024-09-02)

免责任声明: 任何可操作性的内容与本人无关,文章内容仅供参考学习&#xff0c;如有侵权损害贵公司利益&#xff0c;请联系作者&#xff0c;会立刻马上进行删除。 一、分析 目前可增加曝光阅读流量渠道入口&#xff08;完成&#xff09; 1. 发现页 打开小红书app选择顶部发现页&…

【网络世界】网络层

目录 &#x1f308;前言&#x1f308; &#x1f4c1; 网络层 &#x1f4c1; IPV4 &#x1f4c2; 什么是IP地址 &#x1f4c2; 网段划分 &#x1f4c2; 特殊IP &#x1f4c2; 内网和公网 &#x1f4c2; IPV4的危机 &#x1f4c1; IP协议格式 &#x1f4c1; 路由 &#x1f…

VSCode+Keil协同开发之Keil Assistant

VSCodeKeil协同开发之Keil Assistant 目录 VSCodeKeil协同开发之Keil Assistant1. 效果展示2. Keil Assistant简介3. Keil Assistant功能特性4. 部署步骤4.1. 部署准备4.2. 安装Keil Assistant插件4.3. 配置Keil Assistant插件 5. Keil Assistant使用6. 总结 大家在单片机开发时…

密码学基础

一、理论知识 科尔霍夫原则 1、对于一个密码学系统&#xff0c;应当仅有密钥是保密的&#xff0c;其余算法和一切参数都应该是公开的 2、并不一定要数学上完全不可破解&#xff0c;只要在现实中不可能破解即可 对称加密 加密解密都使用相同的密钥 非对称加密 1、加密解密…

【iOS】通过第三方库Masonry实现自动布局

目录 前言 约束 添加约束的规则 使用Masonry自动布局 Masonry的常见使用方法 补充 前言 在暑期完成项目时&#xff0c;经常要花很多时间在调试各种控件的位置上&#xff0c;因为每一个控件的位置都需要手动去计算&#xff0c;在遇到循环布局的控件时&#xff0c;还需要设…

【安当产品应用案例100集】014-使用安当TDE实现达梦数据库实例文件的透明加密存储

随着数据安全重要性的不断提升&#xff0c;数据库文件的落盘加密已成为数据保护的一项基本要求。达梦数据库作为一款高性能的国产数据库管理系统&#xff0c;为用户提供了一种高效、安全的数据存储解决方案。本文将详细介绍如何利用安当KSP密钥管理平台及TDE透明加密组件来实现…

OpenAI即将推出自然语音功能

&#x1f989; AI新闻 &#x1f680; OpenAI即将推出自然语音功能 摘要&#xff1a;测试博客testingcatalog揭示OpenAI正在通过逆向工程ChatGPT应用&#xff0c;计划增加更自然的语音朗读功能。未来可能推出8种新语音&#xff0c;具有独特代号&#xff0c;能表达动物叫声等非…

【kafka】在Linux系统中部署配置Kafka的详细用法教程分享

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

华为云征文|部署电影收藏管理器 Radarr

华为云征文&#xff5c;部署电影收藏管理器 Radarr 一、Flexus云服务器X实例介绍1.1 云服务器介绍1.2 应用场景1.3 性能模式 二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 Radarr3.1 Radarr 介绍3.2 Docker 环境搭建3.3 Radarr 部署3.4 Rada…

Django 第十三课 -- Form 组件

Django Form 组件用于对页面进行初始化&#xff0c;生成 HTML 标签&#xff0c;此外还可以对用户提交的数据进行校验&#xff08;显示错误信息&#xff09;。 报错信息显示顺序&#xff1a; 先显示字段属性中的错误信息&#xff0c;然后再显示局部钩子的错误信息。若显示了字…

如何打造高校实验室预约系统?Java SpringBoot助力高效管理,MySQL存储数据,Vue前端展现,四步实现学生轻松预约!

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

已解决centos7 yum报错:cannot find a valid baseurl for repo:base/7/x86_64的解决方案

出现cannot find a valid baseurl for repo:base/7/x86_64错误通常是由于YUM仓库源无法找到或无法访问&#xff0c;导致YUM无法正常工作。这种情况常见于CentOS 7系统。解决这个问题需要检查几个方面&#xff0c;如网络连接、DNS设置和YUM仓库源配置。 &#x1f9d1; 博主简介&…

思科交换机端口安全配置1

#网络安全技术实现# #任务一交换机端口安全配置1# #1配置计算机的IP 地址、子网掩码和网关 #2配置交换机B的主机名称&#xff0c;创建vlan 10和vlan 20&#xff0c;将f0/1、2划入vlan 10&#xff0c;f0/3、4划入vlan 20&#xff0c;将f0/24配置为Trunk Switch(config)#hostna…

修改服务器DNS解析及修改自动对时时区

修改服务器DNS解析&#xff1a; 1、搜索一下当地的DNS服务器的地址 2、登录服务器&#xff0c;执行 vim /etc/resolv.conf文件&#xff0c;在nameserver字段后填写DNS服务的地址 3、chattr i /etc/resolv.conf 加上不可修改权限&#xff0c;防止重启DNS被修改 修改自动对时…

解读GaussianTalker:利用音频驱动的基于3D高斯点染技术的实时高保真讲话头像合成

单位&#xff1a;首尔大学 项目地址&#xff1a;https://ku-cvlab.github.io/GaussianTalker/ github&#xff1a;https://github.com/KU-CVLAB/gaussiantalker 本文是对GaussianTalker的解读&#xff0c;欢迎大家阅读指正&#xff01; 目录 前言摘要一、背景介绍二 相关工作三…

centos 7部署nacos 2.4.1版本单点方式

文章目录 Nacos&#xff1a;微服务架构中的服务发现与配置管理利器官方网址引言Nacos简介Nacos的核心功能1. 服务发现和服务健康监测2. 动态配置服务3. 服务及其元数据管理 Nacos的工作原理Nacos的集群部署与高可用性Nacos的使用场景如何使用Nacos1. 安装Nacos2. 服务注册与发现…

设计模式 -- 访问者模式(Visitor Pattern)

1 问题引出 1.1 测评系统的需求 将观众分为男人和女人&#xff0c;对歌手进行测评&#xff0c;当看完某个歌手表演后&#xff0c;得到他们对该歌手不同的评价(评价 有不同的种类&#xff0c;比如 成功、失败 等) 1.2 传统方式解决 如果系统比较小&#xff0c;还是 ok 的&#…

安装 rocky9.4

涉及软件&#xff1a;virtualbox、rocky linux 9.4、mobaxterm virtualbox新建虚拟机&#xff0c;设置虚拟机配置 启动虚拟机&#xff0c;第一次会提示挂载虚拟光盘&#xff0c;选择下载的rocky linux 9.4。 选择第一项&#xff0c;安装rocky linux 9.4 进入安装设置&#…