
网络编程
文章平均质量分 83
文章由C语言技术网资料整理而来
行孤、
就写博客做做笔记,写一下我自己的想法。
展开
-
poll 模型
一、poll 模型简介 从字面含义来看,poll 就是对集合中的文件描述符进行调查。1.没有文件描述符数量限制 poll 和 select 在本质上没有差别,管理多个文件描述符也是进行轮询,根据描述符的状态进行处理,但是 poll 没有最大文件描述符数量的限制2.fdset 采用数组 select 的 fdset(存放文件描述符的集合)采用 bitmap,select 默认大小为 1024,可以修改但是没有必要;poll 采用了数组,这个数组的大小根据业务的需求去定义大小。那么意思就是可原创 2021-10-10 22:10:23 · 1836 阅读 · 0 评论 -
select 的缺点
1.select 支持的文件描述符数量太少了(比如说可以监视的socket),默认是1024,虽然可以调整,但是描述符数量越大,效率越低,调整的意义不大。 2.每次调用select ,都要产生拷贝。需要把fdset 从用户态拷贝到内核,需要将fdset备份。每次调用select函数都要将socket集合备份。当次数很大时,就产生了大量的拷贝,大量的开销。 同时在线的大量客户端有事件发生的可能很少,但是每次有事件发生都要遍历fdset。当监视的描述符数量增加时,其效率就会线性下降。...原创 2021-10-10 19:38:20 · 738 阅读 · 0 评论 -
select 模型代码详解
文章目录一、select 的第一个参数(监视的范围)二、第二个参数三、第三个参数四、第四个参数五、第五个参数(超时的机制)六、函数返回值1.成功的返回1.1 成功的返回的含义1.2 FD_ISSET() 判断是哪个socket发生事件1.3 FD_ISSET() 的返回值2.错误的返回值3.演示错误的集合3.1 正常的情况3.2 错误的情况4.捕捉到了信号5.返回0的情况(超时)七、利用select函数来实现tcp的超时机制八、pselect 函数一、select 的第一个参数(监视的范围) 这个原创 2021-10-10 17:06:57 · 1612 阅读 · 0 评论 -
ftp 的简单应用
1.ftp 下载脚本 ftp 怎么使用呢,可以从服务器中下载文件,一般可以写脚本下载文件。下面是从服务器中下载文件的脚本#下载文件ftp -n <<EOFopen 服务器ipuser 服务器用户名和密码binarycd /home/xza/qxidc/data/ftp/surfdata #进入服务端要下载的文件的目录lcd /root/data #下载后文件存放在本地的位置hashprompt offmget *mdelete * #下载后这个文件后,删除服务器的这原创 2021-04-03 17:26:38 · 554 阅读 · 0 评论 -
Linux 调用可执行程序
文章目录一、exec函数族1.参数说明2.示例程序2.1 测试 ls 命令2.2 测试客户端可执行程序(编译过的)3.使用execl 常用方法二、system函数1.函数的声明及参数2.示例程序 在C/C++程序中,经常需要调用其它的程序来先成某项任务,例如其它的C/C++程序、操作系统命令或Shell脚本,C/C++提供了exec函数族和system函数来实现这个功能。一、exec函数族 exec函数族提供了一个在进程中启动另一个程序执行的方法。它可以根据指定的文件名或目录名找到可执行文件,并用原创 2021-03-23 16:16:13 · 2670 阅读 · 1 评论 -
Linux 线程同步
文章目录一、线程同步的概念二、互斥锁1、初始化锁2、阻塞加锁3、非阻塞加锁4、解锁5、销毁锁(此时锁必需unlock状态,否则返回EBUSY)三、示例程序1.代码解析2.为什么要加锁呢3.测试加锁与不加锁一、线程同步的概念 在人们的日常生活中的锁大概有两种:一种是不允许访问;另一种是资源忙,同一时间只允许一个使用者占用,其它使用者必须要等待。 1)不允许访问的锁容易理解,就像每家每户的门锁,不允许外人进入。 2)第二种锁,例如火车上的厕所,它是公共的,空闲的时候任何人可以进入,人进去以后原创 2021-03-23 13:06:14 · 141 阅读 · 0 评论 -
Linux多线程
文章目录一、线程的概念二、线程的使用1、创建线程2、线程的终止3、多线程的socket服务端3.1 测试一个进程多个线程3.2 测试多个线程共享全局变量3.3 需要注意几个问题:三、线程资源的回收四、查看线程五、注意事项一、线程的概念 和多进程相比,多线程是一种比较节省资源的多任务操作方式。启动一个新的进程必须分配给它独立的地址空间,每个进程都有自己的堆栈段和数据段,系统开销比较高,进行数据的传递只能通过进行间通信的方式进行。 在同一个进程中,可以运行多个线程,运行于同一个进程中的多个线程,它们彼原创 2021-03-22 20:49:19 · 138 阅读 · 0 评论 -
Linux 用信号量给共享内存加锁
前面简单得学习了共享内存和信号量,其中信号量的一个重要作用就是对共享资源的保护,保证共享资源在一个时刻只有一个进程独享。那么现在,就来测试一下。一.测试代码#include <stdio.h>#include <sys/sem.h>#include <string.h>#include <unistd.h>#include <sys/ipc.h>#include <sys/shm.h>#include <err原创 2021-03-22 13:04:04 · 2376 阅读 · 0 评论 -
Linux 的信号量
文章目录一.信号量的概念二.相关的函数1.包含的头文件2.semget 函数2.1.函数的声明及参数2.2. 示例3.semctl 函数3.1 函数的声明及参数3.2 示例4.semop函数4.1 函数的声明及参数4.2 示例三.示例程序1. 示例程序(book259.cpp)2.测试四.其他的操作命令1.查看系统的信号量2.手工删除信号量一.信号量的概念 信号量(信号灯)本质上是一个计数器,用于协调多个进程(但不包括父子进程)对共享数据对象的读/写。它不以传输数据为目的,主要是用来保护共享资源(共享原创 2021-03-21 14:58:47 · 840 阅读 · 2 评论 -
Linux 共享内存
一.共享内存的概念 共享内存(Shared Memory)就是 允许多个进程访问同一个内存空 间,是在多个进程之间共享和传递数据最高效的方式。操作系统将不同进程之间共享内存安排为同一段物理内存,进程可以将共享内存连接到它们自己的地址空间中,如果 某个进程修改了共享内存中的数据,其它的进程读到的数据也将会改变. 共享内存并未提供锁机制,也就是说,在某一个进程对共享内存的进行读写的时候,不会阻止其它的进程对它的读写。如果要对共享内存的读/写加锁,可以使用信号灯。二.相关函数 Linux中提供了原创 2021-03-20 20:59:19 · 393 阅读 · 0 评论 -
Linux 的信号 signal
一.让程序在后台运行 在之前的章节中,如果要想程序,在命令提示行下输入程序名后按回车键,程序被运行,然后等待程序运行完成。在程序运行的过程中,也可以用 Ctrl+c 中止它。 在实际中,我们需要让程序在后台运行,没有界面,没有用户输入数据,例如 socket服务端程序。 如果想让程序在后台运行,有两种方法。1.加 “&” 符号让程序在后台运行 如果想让程序在后台运行,执行程序的时候,命令的最后面加“&” 符号。如:./C++封装服务端 5005 & (1)输原创 2021-03-19 22:30:56 · 1079 阅读 · 0 评论 -
Linux 进程之间的通信
文章目录一.进程通信的必要性1.数据传输2.数据传输3.通知事件4.进程控制二.进程通信的方式1.管道2.消息队列(message)3.信号(signal)4.共享内存5.信号量(semaphore)6.套接字(socket)三.注意事项一.进程通信的必要性 进程的数据空间是独立的,私有的,不能互相访问,但是在某些情况下进程之间需要通信来实现某些功能或交换数据。比如1.数据传输 数据传输:一个进程需要将它的数据发送给另一个进程。2.数据传输 共享数据:多个进程想要操作共享数据,一个进程对原创 2021-03-19 11:07:04 · 283 阅读 · 0 评论 -
Linux 多线程的应用
前面的章节介绍socket通信的时候,socket的服务端在同一时间只能和一个客户端通信,并不是服务端有多忙,而是因为第单进程的程序在同一时间只能做一件事情,不能一边等待客户端的新连接一边与其他 的客户端进行通信。一.并发的服务端 如果把 socket 服务端改为多进程,在每次 accept 到一个客户端的连接后,生成一个子进程,让子进程负责和这个客户端通信,父进程继续 accept 客户端的连接。socket 的服务端在监听新客户端的同时,还可以与多个客户端进行通信。这就是并发,如下图1.原创 2021-03-18 21:06:05 · 210 阅读 · 0 评论 -
Linux 的多进程
一.进程的概念 什么是进程?进程这个概念是针对系统而言,对于我们来说,我们面对的概念是程序。当输入指令执行一个程序的时候,系统将启动一个进程。 进程顾名思义就是正在进行的程序,或者说是正在运行的程序, Linux 下一个进程在内存中有三部分数据: "代码段“ 、“堆栈段”和“数据段”。1.代码段 代码段就是存放了程序代码2.堆栈段 存放的是程序的返回地址、程序的参数以及程序的局部变量。3.数据段 存放的是程序的全局变量,常数以及动态数据分配的数据空间(比如用 new 函数分配原创 2021-03-17 23:42:22 · 828 阅读 · 0 评论 -
封装网络通信 socket 服务端和客户端
啊啊啊原创 2021-03-16 21:07:27 · 575 阅读 · 0 评论 -
TCP 报文分包和粘包
1.分包和粘包1.1 分包 发送方发送字符串 “helloworld” ,接收方却接收到了两个字符串 “hello” 和 “world”。1.2 粘包 发送方发送两个字符串 “hello” 和 “world”,接收方却一次性接收到了 “helloworld”。2.TCP是可靠传输 可靠传输能保证数据无差错、无丢失、按序和无重复的交付。 1)顺序不变,例如发送方发送hello,接收方也一定顺序接收到hello,这个是TCP协议承诺的,因此这点成为我们解决分包和粘包问题的关键. 2)原创 2021-03-15 12:19:52 · 1597 阅读 · 1 评论 -
recv() 和 send() 的改进——Write() 和 Readn()
1.recv() 和 send() 的缺点 这recv()函数存在可能读取报文不完整的情况,send()存在可能写入数据不完整的情况。1.1 recv() 函数的改进——Readn()ssize_t recv(int sockefd, void *buf, size_t len, int flage); (1)函数的返回值是这次接收到数据的大小。但是你打算读取1000个字节,只能读取100个(TCP存在分包的问题)。要将数据读取完,需要采用循环多次调用这个函数。所以将这个函数改进为 Readn原创 2021-03-15 10:33:46 · 375 阅读 · 1 评论 -
TCP 的三次握手与连接队列
1.TCP三次握手 左边是客户端,右边是服务端。 TCP的三次握手是底层实现的,不需要调用我们调用什么函数或者代码去做这个过程。2.listen() 的socket 队列 内核会为 listen 状态的 socket 维护两个队列:不完全连接请求队列(SYN_RECV)和等待 accept() 建立的队列(ESTABLISHED)3.listen() 的 backlog 参数(1)函数声明:int listen(int sockfd, int backlog); 在Linux原创 2021-03-14 23:10:33 · 367 阅读 · 0 评论 -
socket网络通信中的 listen(),connecet() 和 accept()函数
一、listen() 函数1.作用: listen() 函数把主动连接套接字变为被动连接的套接字,使得这个 socket 可以接受其他 socket 的连接请求,从而成为一个服务端的 socket。2.函数声明及参数2.1 函数声明int listen(int sockfd, int backlog);2.2 函数参数 (1)参数 sockfd: 参数sockfd是已经被bind过的socket(这个函数是监听,肯定是先绑定了,才监听)。 socket函数返回的socket是一原创 2021-03-14 19:36:33 · 3637 阅读 · 0 评论 -
socket通信 bind() 函数详解
一.函数解释1.函数的作用: 服务端用于将把用于通信的地址和端口绑定到 socket 上。所以可以猜出,这个函数的参数应该包含:用于通信的 socket 和服务端的 IP 地址和端口号。ip地址和端口号是放在 socketaddr_in 结构体里面的。2.函数的声明:int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen); (1)参数 sockfd ,需要绑定的socket。 (2)参数 addr ,存放了原创 2021-03-13 09:23:26 · 47196 阅读 · 2 评论 -
socket通信中万恶的结构体
文章目录1.socket通信服务端代码示例2.socket通信客户端代码示例3. 重要结构体3.1struct sockaddr3.2 struct sockaddr_in3.3 struct hostent4.补充一些函数4.1 inet_aton() 函数4.2 inet_ntoa() 函数 socket通信让初学者望而却步的首选socket通信中涉及的结构体,那么下面就啦介绍一下socket通信中涉及的一些重要的结构体。1.socket通信服务端代码示例#include <stdio.h原创 2021-03-12 22:27:39 · 922 阅读 · 0 评论 -
socket编程中的 htons()
文章目录1.内存存储数据的方式1.1 数据字节序号1.2 小端字节序1.3 大端字节序2. 转换顺序2.1 网络字节序2.2 主机字节序2.3 转换函数 在刚刚接触 socket 时,遇到了 htons() 函数,就直接懵逼了,这是什么东西,有什么用?就查了一些资料。 htons() 是网络字节序与主机字节序之间转换的函数。用生活中的例子来说,有一串数字 12345678 现在我们是从左往右读的,以前的人是从右往左读的。当你要给以前的人读的话就要把这串数据写成 87654321 。htons() 就原创 2021-03-12 18:09:10 · 7622 阅读 · 0 评论 -
网络编程基础socket通信
一、网络通信socket的概念 socket就是插座的意思,在我们的生活中,插上了就可以接通电源。就像这一盏灯 在计算机网络中socket也称为“套接字”,它描述了计算机的IP地址和端口,运行在计算机中的程序之间采用socket进行数据通信。通信的两端都有socket(两端都要有,这样才能彼此找到对方),它是一个通道,数据在两个socket之间进行传输。 socket把复杂的TCP/IP协议族隐藏在socket接口后面,只要用好socket相关的函数,就可以完成数据通信。二、套接字(s原创 2021-03-11 17:37:52 · 1446 阅读 · 2 评论