关于linux软件编程9——网络编程1

多任务编程
1进程基础操作

  • 创建-- fork
  • 执行--exec
  • 结束[--exit/ exit return(main)
  • 孤儿进程
  • 僵尸态进程
  • 进程回收--wait/waitpid

2进程间通信

1同主机进程间通信:

  • 管道
  • 信号
  • 共享内存
  • 消息队列
  • 信号灯集

2不同主机间的进程间通信

  • socket

3线程 基础操作

  • 创建pthread_create执行线程回调函数
  • 结束
    • pthread_exit
    • return
    • pthread_cancel
    • //exit
  • 线程资源回收:
    • //pthread detach 分离属性 结合属性
    • pthread_join

4线程间(同步+互斥)

  • 互斥锁pthread_mutex
  • 信号量sem

5进程vs线程

  • 进程和线程 都是系统执行任务
  • 进程:资源分配的基本单位
  • 线程:调度执行的最小单位
  • 进程的创建 和 切换 的开销 大
    • 进程间通信空间独立------安全,稳定
  • 线程的创建 和切换 的开销 小
    • 线程共享进程资源方便
    • 线程间资源竞争------线程间的同步互斥机制

不同主机间的进程间通信

网络:

  • 无线:4G /5G 卫星 有线:光纤
  • 通信:
    • 物理层面问题---通路
    • 逻辑层面问题---逻辑上软件层面链接

1什么是ip地址

  • IP地址是主机的唯一标识,网络地址和主机号组成
  • 网络地址是子网的唯一标识,类似于电话号码的区号;主机号是子网内每台主机的编号
  • IP地址本质是32bit的二进制数,点分十进制表示(划分为4个字节,每个字节转化成相应的十进制数,字节之间用"."来分隔)

|----|-----------------------|-------------------------|---------------|
| 类型 | 范围 | 用途 ||
| A类 0.x.x.x---127.x.x.x.x || 10.x.x.x | 私网(局域网)地址 |
| A类 0.x.x.x---127.x.x.x.x || 127.x.x.x | 环回网络地址 |
| A类 0.x.x.x---127.x.x.x.x || 其他 | 大型主干网地址 |
| B类 128.x.x.x - 191.x.x.x || 172.16.x.x - 172.31.x.x | 私网(局域网)地址 |
| B类 128.x.x.x - 191.x.x.x || 169.254.x.x | 表示没有找到DHCP服务器 |
| B类 128.x.x.x - 191.x.x.x || 其他 | 主干(城市)网地址 |
| C类 | 192.x.x.x - 223.x.x.x | 192.168.x.x | 私网(局域网)地址 |
| D类 | 组播地址 |||
| E类 | 保留 |||

2什么是子网掩码?

  • 255.255.255.0
  • IP地址与子网掩码按位取与运算------获取IP地址中的网络地址和主机地址

3.什么是网关

一个网络到另一个网络的关口。

4DNS(域名解析系统)

www.baidu.com(域名,计算机名,人类好记忆的网址)转换成百度服务器的IP地址

5 OSI模型七层模型(open system internet)

(物理链路和逻辑链路都连通才能实现通信

应用层 //表示一层会话层

表示层 //压缩 加密

会话层 //管理一次通信过程

传输层 //传输过程中网络信息

控制网络层 //网络间如何通信

数据链路层 //01组合的数据帧物理层

物理层 //物理通信 电气特性

6tcp/ip模型

OSI是一个参考模型(教学模型),实际用到网络层次--- tcp/ip模型

7tcp/ip 4层模型 5层模型区别

(每层之间通过协议连接,物理层和数据链路层连接紧密,4/5区别在于此)

8Linux和网络模型的联系

  • linux一切皆文件,提供一个网络操作的特殊文件socket

1.socket是网络通信的特殊文件

2.socket也是linux系统提供的一个编程接口

3通过这个编程接口,就可以使用到linux的网络功能

9封包---解包过程(类似于寄快递拆快递),每层之间通过协议(prtocol)连接

10两个重要协议
1.TCP(transmision control protocol) :(类似 打电话)---可靠(1.连接 2.可靠传输 3.字节流)

特点:a.面向连接(就是在进行通信之前,必须建立好一条逻辑上的通路)

b.提供可靠传输(四个"无",无丢失,无失序,无差错,无重复)

建立连接:

tcp三次握手 目的:建立连接

client--------------server

step1 《我要通话》 //连接的请求

step2《嗯,我知道了,你可以--》 //对方接听电话 喂

step3《嗯,好的》//喂

可靠的连接//类似打电话

2.UDP(User datagram Protocol) :(类似 生活中的广播)(1.不可靠,2.无连接 3.数据报)

特点:不提供可靠传输,

在数据发送时,不需要建立连接

应用:(1).小数据,但是对速度要求较高:(QQ.及时文本信息,语音等实时性要求较高场合)

(2).广播,组播//电子教师(vnc-广播)

(3).无线网的传输//udp

网络通信模式:

c/sclient 客户端/server服务器

b/sbrowser浏览器 server服务器

p2p peer to peer 点对点(人越多越快)

11基于tcp学习tcp网络编程模型:

基于TCP客户_服务器程序的套接字函数

套接字在程序中的位置:

tcp通信 类似 打电话

tcp客户端: //角色---主动的一方

  • socket//买了个电话)
  • bind(可选)//买了sim卡
  • connect//拨打电话

  • write
  • read
  • close

tcp服务器://角色被动的一方

  • socket//买了个电话
  • bind//买了sim卡
  • listen//监听~-待机
  • accept//接听

  • read //通信
  • write
  • close //挂机

12 客户端函数接口:

  • socket函数
cpp 复制代码
socket函数
#include <sys/types.h>
#include <sys/socket.h>
int sodket(int domain,int type,int protocol);
功能:
    创建了通信的一端
    返回文件描述符
参数:
    @domain //域-- 范围(是选本地的 还是网络的)
            //ip地址
            // ipv4 32位数据
            // ipv6 128位 ipv6:更大范围地分配ip地址(地球上每一粒沙子都能分到一个IP地址)
            //本地套接字
            //protocol //协议
            AF_INET
    @type//用来说明socket这种网络通信的文件的类型
            SOCK_STREAM //流式套接字
            Provides sequenced,reliable,two-way(双工),connection-based byte streams.
            Anout-of-band data transmission mechanism may be supported.An
            SOCK DGRAM  //数据报套接字
            Supports dataqrams(connectionless,unreliable messaqes of a fixed maximum length)
            
    @protocol //协议
            0   // linux系统上 SOCK STREAM ---TCP
                // 类linux系统行
                //SOCK DGRAM --- UDP

返回值:
            成功  返回socket对应的fd
            失败   -1 && errno被设置 //perror

connect函数

cpp 复制代码
Connect
int connect(int sockfd,const struct sockaddr* addr,socklen taddrlen);
功能:
    通过socket链接到指定的地址上
参数:
   @sockfd socket创建的fd
   @addr标识网络中一个进程对应的地址
    ip:确定一台主机
    端口号:用来标识一个网络通信的进程
    ip+端口号

struct sockaddr *addr//不是通用的
socket 不同的通信范围
不同通信域 都有自己特定的结构体

ipv4通信域 的结构体:
struct sockaddr_in {
    sa_family_t  sin_family;       /* address family:AF_INET */
    in_port_t    sin_port;         /* port in network byte order端口号 *
    struct in_addr sin_addr;      /* internet address - ip地址*/
};

/* Internet address.*/
struct in_addr {
uint32_t    s_addr;            /* address in network byte order */
};


in_addr_t   inet_addr(const char *cp);

cp 表示要用的ip地址的字符串 //点分十进制

        "192.168.0.150"

返回:网络字节序形式的ip地址的32位数值        

  @addrlen
       说明 第二个参数的地址类型的大小
    返回值:
        成功0
        失败 -1&&errno

端口号:16位的整型数据

0~1023 //1024---知名端口号

//http -- 80

1024~50000//特定端口号

50000~//临时分配的端口号
计算机的大小端内存和网络字节序

发送的时候必须转换:--- 网络字节序(大端)

接收 : --- 根据主机的大小端转换

cpp 复制代码
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);

uint16_t htons(uint16_t hostshort);

uint32_t ntohl(uint32_t netlong);

uint16_t ntohs(uintl6_t netshort);

h-- host

to -- 到

n --network

l -- long//处理4字节数据

s --short//处理2字节数据

cpp 复制代码
in_addr_t   inet_addr(const char *cp);

cp 表示要用的ip地址的字符串 //点分十进制

        "192.168.0.150"

返回:
        网络字节序形式的ip地址的32位数值  

13服务器端函数接口:
socket (同上)
bind:

cpp 复制代码
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
int bind   (int sockfd, const struct sockaddr *addr, socklen_t addrlen);
功能:
   给sockfd 绑定一个地址信息(ip+port)
参数:
  @sockfd  --- 要操作的socket 
  @addr    --- 要绑定的地址信息 
  @addrlen --- 地址信息对应的大小 
返回值:
     成功 0
   失败 -1&&errno
   
#include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>

  int listen(int sockfd, int backlog);
  功能:
     将sockfd对应的socket设置为监听套接字 
	 //这个套接字 负责看 有没有客户端,发送连接请求 
	 //有了放等待队列中
  参数:
  @sockfd  ---socket 的fd
  @backlog  --- 等待队列的长度 
返回值:
   成功 0
   失败 -1&&errno
   //dos 攻击 

​

accept

cpp 复制代码
int accept (int sockfd,     struct sockaddr *addr, socklen_t *addrlen);
功能:
   从监听的socket中提取连接请求,完成连接(三次握手)
   返回已连接的一个新socket 
参数:
  @sockfd --- 监听的socket的fd
  @addr   --- 用来存放,客户端的地址信息 
  @addrlen --- 值结果参数 
               注意:  必须初始化 ,初始成 addr对应sockaddr_in 类型的大小			   
返回值:
  成功 返回 已连接的socket的fd  //专门用于后面通信的 
  失败 -1 &&errno 
cpp 复制代码
bzro函数: 把结构体初始化 0

#include<strings.h>
bzero(地址,大小);
cpp 复制代码
char *inet_ntoa(struct in_addr in);
//将网络字节序形式的ip地址 转换为 点分十进制格式的 ip 字符串 

ex1:

客户端给服务器发消息

服务器再回发消息

tcp 客户端

clifd = socket

connect

fgets//stdin

write (clifd)

read (clifd)

tcp 服务器

listenfd = socket

bind

listen

connfd = accept()

read(connfd)

sprintf(sbuf,"server+%s",rbuf);

write(connfd,sbuf)

ex2:

客户端 与 服务器实现一个点对点聊天

tcp 客户端

clifd = socket

connect

//收 --父进程

//发 --子进程

tcp 服务器

listenfd = socket

bind

listen

connfd = accept()

//收 -- 父进程

//发 -- 子进程

12基于udp学习 tcp网络编程模型

相关推荐
时间裂缝里的猫-O-30 分钟前
@Linux问题 :bash fork Cannot allocate memory 错误分析与解决方案
linux·chrome·bash
派拉软件36 分钟前
微软AD国产化替换倒计时——不是选择题,而是生存题
网络·安全·microsoft·目录管理·微软ad替换·身份与访问控制管理iam
躺不平的小刘43 分钟前
从YOLOv5到RKNN:零冲突转换YOLOv5模型至RK3588 NPU全指南
linux·python·嵌入式硬件·yolo·conda·pyqt·pip
愚昧之山绝望之谷开悟之坡1 小时前
| `cat /etc/os-release` | 发行版详细信息(如 Ubuntu、CentOS) |
linux·ubuntu·centos
mysla1 小时前
嵌入式学习day34-网络-tcp/udp
服务器·网络·学习
成富1 小时前
MCP 传输方式,stdio、HTTP SSE 和 Streamable HTTP
网络·网络协议·http
扶尔魔ocy1 小时前
【QT入门到晋级】进程间通信(IPC)-socket(包含性能优化案例)
网络
卓码软件测评2 小时前
软件测试:如何利用Burp Suite进行高效WEB安全测试
网络·安全·web安全·可用性测试·安全性测试
明天见~~2 小时前
Linux下的网络编程
linux·运维·网络
NEXU52 小时前
Linux:网络层IP协议
linux·网络·tcp/ip