当前位置: 首页 > news >正文

【Linux】网络编程

目录

端口号

网络字节序

socket编程

接口

sockaddr结构

udp网络程序

创建套接字

绑定

接收

发送

客户端需要绑定吗?

客户端执行方法

本地环回地址

终端文件

代码

tcp网络程序

SOCK_STREAM

监听

查询网络信息

获取新连接

地址转换函数

客户端绑定

多进程版本

关闭多余文件描述符

如何解决父进程等待子进程会阻塞的问题?

多线程版本

线程池版本

守护进程

进程与任务的关系


端口号

网络通信不仅包括建立连接,还有应用层的通信。

端口号负责判断发给上层哪一个应用。

发送方和接收方在报头中有对应的源端口号和目的端口号。

这种基于ip+端口的通信方式叫socket。

端口号与进程id

绑定的过程就是把进程pcb和哈希表中端口对应位置关联起来。


网络字节序

转换接口


socket编程

接口


sockaddr结构

套接字有三种

设计者不想写三套接口,就需要把类型统一,所以都传入sockaddr结构体,判断地址类型从而决定套接字的种类。


udp网络程序

创建套接字

第一个参数是域的类型

第二个参数是套接字类型

第三个参数是协议类型

返回值是文件描述符


绑定

第二个参数是自己构造一个结构体传进去

family表示域类型,port是端口号,addr是ip

本主机的端口号要发送出去会经过网络,所以要转网络字节序。

ip要发出去也要转网络字节序。

整数ip和字符串ip快速转换

整数转字符串:构造四个八位整型的结构体,将整数强转该结构体类型,分别访问结构体并转字符串。

字符串转整型:将整数强转四个八位结构体类型,分别访问并赋值。

第三个参数是结构体大小。

 绑定不推荐直接绑定具体ip一般写0.0.0.0,因为有一些主机有多个网卡,绑定一个其他网卡就接收不了了。

INADDR_ANY表示接收任意地址

绑定端口尽量大一点,1023以下是内置端口。


接收

从套接字中读一个报文

结构体是输出型参数,负责获得对方的信息。

buffer是对方发送的内容,结构体是对方的信息


发送

结构体是发送目标的信息


客户端需要绑定吗?


客户端执行方法

把代码进行分层,处理方法分开。

popen把字符串当成命令,创建子进程,父子进程建立管道,子进程执行命令,结果返回给父进程。


本地环回地址

往下贯穿协议栈,然后又往上返回,不进入网络


终端文件

把输入到2号文件的内容重定向到2号终端。

xshell可以开很多个终端,查询终端。


代码

 socket_lesson/my_udp · lyh/linux - 码云 - 开源中国


tcp网络程序

SOCK_STREAM

选择SOCK_STREAM面向字节流。

监听

查询网络信息

l表示listen,p表示对应进程,t表示tcp。

获取新连接

返回值也是文件描述符

accept返回的文件描述符负责真正的IO服务,参数的文件描述符负责建立连接,一般叫作监听套接字。

连接获取失败就继续重新获取。

地址转换函数

客户端绑定

多进程版本

关闭多余文件描述符

多进程版,子进程会继承文件描述符信息,让子进程负责IO就可以把监听套接字关了,父进程不关注IO也可以把不需要的文件描述符关了。

如何解决父进程等待子进程会阻塞的问题?

利用孙子进程解决,把事情给孙子进程做,子进程直接退出,父进程也等待完毕。

第二种方法:用信号忽略

多线程版本

detach线程分离从而不用等待子线程 

当静态函数想访问类内成员时,可以把线程的参数结构加一个该类的指针。

线程池版本

假如服务端正在写,客户端关闭了文件,读端关闭了,写端也会被迫关闭。

这样可以防止写端被关闭。防止服务端被关闭就对这个信号忽略。

客户端重连

服务器挂掉无法立即重新启动,解决方法:

守护进程

每一个用户登陆都会产生一个会话,会话里面会生成bash进程提供命令行服务,一个会话可以有一个前台进程多个后台进程,键盘和信号只能影响前台进程。

&变成后台任务,jobs查看后台任务,fg把后台变成前台

fg变成前台后如何变回后台:先用信号暂停,然后用bg。信号暂停后任务会以停止状态回到后台,bash自动回前台。

进程与任务的关系

任务是一个具体事情,它可以被一个进程完成,也可以被一个进程组完成。

守护进程可以不受用户退出,注销(关闭会话)的影响。

做法:把目标进程(组)迁移到一个新的会话。

调用接口的进程不能是该进程组的组长。解决方法:让子进程调用。

第二种方法:


http://www.mrgr.cn/news/97923.html

相关文章:

  • 2025ArkTS基础UI(一)——Column、Row、Text、Button组件
  • YOLO 8 入坑(持续更新)
  • wsl2+ubuntu22.04安装blenderproc教程
  • 蓝桥杯刷题--宝石组合
  • Kubernetes 入门篇之网络插件 calico 部署与安装
  • [leetcode]01背包问题
  • opencv人脸性别年龄检测
  • SD + Contronet,扩散模型V1.5+约束条件后续优化:保存Canny边缘图,便于视觉理解——stable diffusion项目学习笔记
  • MCU的USB接口作为 USB CDC串口输出
  • matlibplot的交互式demo
  • RocketMQ和kafka 的区别
  • 【图书管理系统】深入解析基于 MyBatis 数据持久化操作:全栈开发图书管理系统:查询图书属性接口(注解实现)、修改图书属性接口(XML 实现)
  • 用最简单的方式讲述离散傅里叶级数(DFS)以及离散傅立叶变换(DFT)
  • 微服务多模块构建feign项目过程与一些报错(2025详细版)
  • 蓝桥杯 C/C++ 组历届真题合集速刷(一)
  • SmolVLM2: The Smollest Video Model Ever(三)
  • 【数据结构 · 初阶】- 单链表
  • mysql-锁的算法(记录锁、间隙锁、临键锁)
  • LeetCode算法题(Go语言实现)_38
  • Spring事务系列 三