linux网络编程
文章平均质量分 76
StudyWinter
持续学习
展开
-
【linux网络编程】select、poll、epoll比较
(2)poll 不再用 BitsMap 来存储所关注的文件描述符,取而代之用动态数组,以链表形式来组织,突破了 select 的文件描述符个数限制,当然还会受到系统文件描述符限制。1)select 使用固定长度的 BitsMap,表示文件描述符集合,而且所支持的文件描述符的个数是有限制的,原创 2022-08-20 20:29:20 · 130 阅读 · 0 评论 -
【linux网络编程】Unix/Linux上的五种IO模型
应用进程(线程)通过调用来读数据,当数据没有准备好时,就处于阻塞模式,等待数据;当数据准备好时,将数据从内核空间拷贝到用户空间(自定义的buff中),完成数据的拷贝。与非阻塞IO的区别在于它提供了消息通知机制,不需要用户进程不断的轮询检查,减少了系统API的调用次数,提高了效率。select、poll、epoll可以设置超时时间,如果没有设置的话,就默认在阻塞状态,设置了之后,也可以工作在非阻塞模式下。当数据就绪之后,根据返回的fd是连接的fd还是通信的fd分别处理,如果是通信的fd,则读数据。...原创 2022-07-27 17:42:33 · 207 阅读 · 0 评论 -
【linux网络编程】阻塞、非阻塞、同步、异步
阻塞、非阻塞、同步、异步描述的都是IO的一些状态。一个典型的网络IO包含两个阶段(1)数据准备和(2)数据读写。例如给recv这个函数传入sockfd、buff、buff的大小。这个数据就绪指的是在远端有没有数据过来(TCP缓冲区是否有数据可读),当sockfd工作在阻塞模式下时,此时调用recv函数,如果数据没有就绪,recv函数是会阻塞当前线程的;当sockfd工作在非阻塞模式下时,此时调用recv函数,是会立即返回的。业务层面的同步是A操作要调用B的返回值时,A要一直等着,这是同步;...原创 2022-07-27 17:04:28 · 837 阅读 · 0 评论 -
libevent库学习(2)
本次重点介绍bufferevent。很多时候,除了响应事件之外,应用还希望做一定的数据缓冲。比如说,写入数据的时候,通常的运行模式是(1)决定要向连接写入一些数据,把数据放入到缓冲区中(2)等待连接可以写入(3)写入尽量多的数据(4)记住写入了多少数据,如果还有更多数据要写入,等待连接再次可以写入这种缓冲lO模式很通用,libevent为此提供了一种通用机制,即bufferevent。带有buf的事件对象有两个缓冲区,一个读缓冲区,一个写缓冲区;】这一节的常规事件来记忆。...原创 2022-07-15 16:33:08 · 993 阅读 · 0 评论 -
【linux网络编程】本地套接字通信
socket API原本是为网络通信设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIX Domain Socket。虽然网络socket也可用于同一台主机的进程间通讯(通过loopback地址127.0.0.1),但是UNIX Domain Socket用于IPC更有效率:不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程。这是因为,IPC机制本质上是可靠的通讯,而网络协议是为不可靠的通讯设计的。UNIX Domain Sock原创 2022-07-11 19:32:07 · 226 阅读 · 0 评论 -
【linux网络编程】基于UDP的server-client简单实现
1 server端思路 (1)lfd = socket(AF_INET, STREAM, 0); SOCK_DGRAM --- 报式协议。 (2)bind(); (3)listen(); --- 可有可无 while(1){ (4)read(cfd, buf, sizeof) --- 被替换 --- recvfrom() --- 涵盖accept传出地址结构。小-- 大 write();--- 被替换 --- send原创 2022-07-10 16:51:48 · 520 阅读 · 0 评论 -
TCP状态转换图
如图主动发起连接请求的状态变化如下图。最开始的时候,主动请求端和被动端都处于CLOSED状态。第一阶段:当主动请求端发送SYN标志位后,其状态变化为SYN_SEND;第二阶段:此时被动方收到主动方的请求后,会向主动方发送SYN标志位以及去确认信息ACK,主动方收到信息后,向被动方发送ACK确认信息,此时主动方的状态变化为ESTABLISHED,完成TCP连接的三次握手。SYN_SEND一般不容易见到使用命令查看状态查看客户端查看服务端这里是多进程通信,一个server处于监听状态,另一个serv原创 2022-07-03 14:56:49 · 1441 阅读 · 0 评论 -
【linux网络编程】一个bug
今天重写敲了linux下的C/S模型代码。详见:【linux网络编程】server-client简单实现_StudyWinter的博客-CSDN博客在测试server端的时候,发现输出连接的客户端的ip和port都是0,但是数据传输没有问题。很奇怪 开始排除错误:(1)数据可以正常通信,说明socket、bind、accept以及后面的读写转换都没有问题;(2)输出客户端的数据不对,检查输出语句,函数也没有调用错误,这里也没有问题;(3)客户端的输出数据有问题,检查和客户端有关的语句,还是没有找到错误;于是原创 2022-07-01 11:01:45 · 131 阅读 · 0 评论 -
C++ muduo网络库知识分享01 - Linux平台下muduo网络库源码编译安装
最近在打算学习陈硕大佬的muduo网络库,先安装muduo网络库。Muduo is a multithreaded C++ network library based on the reactor pattern.muduo库的介绍就是:一个基于reactor反应堆模型的多线程C++网络库。muduo网络库是C++语言开发的一个非常优秀的网络库,作者陈硕,muduo网络库在多线程环境下性能非常高,该系列文章会分享一些muduo库源码的知识,包括它的线程池源码,TcpServer源码,还有很转载 2022-04-18 19:00:27 · 837 阅读 · 1 评论 -
C++网络编程 - Boost::asio异步网络编程 - 01- boost库源码编译安装
1 boost库是什么Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容。在C++社区中影响甚大,是不折不扣的“准”标准库。Boost由于其对跨平台的强调,对标准C++的强调,与编写平台无关。但Boost中也有很多是实验性质的东西,在实际的转载 2022-04-18 17:45:13 · 1395 阅读 · 0 评论 -
【linux网络编程】epoll反应堆模型
反应堆的理解:加入IO转接之后,有了事件,server才去处理,这里反应堆也是这样,由于网络环境复杂,服务器处理数据之后,可能并不能直接写回去,比如遇到网络繁忙或者对方缓冲区已经满了这种情况,就不能直接写回给客户端。反应堆就是在处理数据之后,监听写事件,能写会客户端了,才去做写回操作。写回之后,再改为监听读事件。如此循环。...原创 2022-03-19 15:43:18 · 1023 阅读 · 3 评论 -
libevent库学习(1)
1、libevent介绍Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,不如 ACE 那么臃肿庞大;源代码相当精炼、易读;跨平台,支持 Windows、 Linux、 *BSD 和 Mac Os;支持多种 I/O 多路复用技术, epoll、 poll、 dev/poll、 select 和 kqueue 等;支持 I/O,定时器和信号等事件;注册事件优先级。Libevent 已经被广泛的应用,.原创 2022-02-13 20:31:00 · 4239 阅读 · 0 评论 -
【linux网络编程】基于TCP的server-client简单实现
流程 1. socket() 创建socket 2. bind() 绑定服务器地址结构 3. listen() 设置监听上限 4. accept() 阻塞监听客户端连接 5. read(fd) 读socket获取客户端数据 6. 小--大写 toupper() 7. write(fd) 8. close();具体代码/****************......原创 2021-12-15 20:40:32 · 2240 阅读 · 0 评论