网络
文章平均质量分 75
gqtcgq
这个作者很懒,什么都没留下…
展开
-
套接字描述符在多进程和多线程下的共享
一:概述在简单的回射服务例子中,客户端和服务器的交互步骤如下:客户从标准输入中读入一行文本,并写给服务器;服务器从网络输入读入这行文本,并回射给客户;客户从网络输入读入这行回射文本,并显示在标准输出上。下图描述了整个过程: 二:多进程的str_cli其中客户端的str_cli函数处理客户端上的主要逻辑:从标准输入读入一行文本,写到服务器上,然后读会服务器对改行的回射原创 2015-04-05 11:49:39 · 3038 阅读 · 0 评论 -
服务端编程中多线程的应用
本文是陈硕的《Linux多线程服务端编程 使用muduo C++网络库》一书中,第三章的读书笔记。其中暗红颜色的文字是自己的理解,鲜红颜色的文字表示原书中需要注意的地方。 一:进程和线程 每个进程有自己独立的地址空间。“在同一个进程”还是“不在同一个进程”是系统功能划分的重要决策点。《Erlang程序设计》[ERL]把进程比喻为人: 每个人有自己的原创 2016-08-11 18:52:46 · 4756 阅读 · 0 评论 -
epoll与fork
使用epoll时,如果在调用epoll_create之后,调用了fork创建子进程,那么父子进程虽然有各自epoll实例的副本,但是在内核中,它们引用的是同一个实例。所以会发生意想不到的问题,分情况看一下: 1:向子进程中的epoll实例添加描述符,描述符事件触发后,也会影响到父进程的epoll实例,代码如下:#define MAXEVENTS 20int lis原创 2015-09-28 22:22:52 · 2520 阅读 · 1 评论 -
Libev源码分析09:select突破处理描述符个数的限制
众所周知,Linux下的多路复用函数select采用描述符集表示处理的描述符。描述符集的大小就是它所能处理的最大描述符限制。通常情况下该值为1024,等同于每个进程所能打开的描述符个数。 增大描述符集大小的唯一方法是先增大FD_SETSIZE的值,然后重新编译内核,不重新编译内核而改变其值时不够的。 在阅读Libev源码时,发现它实现了一种原创 2015-08-27 22:24:25 · 1223 阅读 · 0 评论 -
Redis源码解析:14Redis服务器与客户端间的交互
Redis服务器是典型的一对多服务器程序,通过使用由IO多路复用技术实现的文件事件处理器,Redis服务器使用单线程单进程的方式来处理命令请求,并与多个客户端进行网络通信。 Redis客户端与服务器之间通过TCP协议进行通信。TCP协议是一种流式协议,数据以字节流的形式进行传递,没有固有的"报文"或"报文边界"的概念,如果需要设置边界,需要应用层自行处理。原创 2016-04-09 17:07:21 · 6155 阅读 · 0 评论 -
Redis源码解析:13Redis中的事件驱动机制
Redis中,处理网络IO时,采用的是事件驱动机制。但它没有使用libevent或者libev这样的库,而是自己实现了一个非常简单明了的事件驱动库ae_event,主要代码仅仅400行左右。 没有选择libevent或libev的原因大概在于,这些库为了迎合通用性造成代码庞大,而且其中的很多功能,比如监控子进程,复杂的定时器等,这些都不是Redis所需要的。原创 2016-04-03 10:55:30 · 3107 阅读 · 1 评论 -
Libev源码分析10:libev中poll的用例
在Libev中,使用poll作为backend时,涉及到下面几种数据结构:int *pollidxs;int pollidxmax;struct pollfd *polls;int pollmax;int pollcnt; polls就是struct pollfd结构的数组,pollmax是该数组的实际大小,pollcnt表示该数组中,有效结构的个数。也就是监控的原创 2015-10-11 13:37:50 · 937 阅读 · 0 评论 -
epoll简介(二)
一:多路复用的举例 以一个生活中的例子来解释: 假设你在大学中读书,要等待一个朋友(数据)来访(要读),而这个朋友只知道你在A号楼(socket集合),但是不知道你具体住在哪里,于是你们约好了在A号楼门口见面。 如果你使用的阻塞IO模型来处理这个问题,那么你就只能一直守候在A号楼门口等待朋友的到来,在这段时间里你不能做别的事情,不难知道,这种方原创 2015-09-27 18:05:46 · 551 阅读 · 0 评论 -
epoll简介(一)
一:概述 1:简介 EPOLL类似于POLL,是Linux特有的一种IO多路复用的机制。它在2.5.44内核中引入。 对于大量的描述符处理,EPOLL更有优势,它提供了三个系统调用来创建管理epoll实例:epoll_create创建一个epoll实例,返回该实例的文件描述符;epoll_ctl注册感兴趣的特定文件描述符,注册的描原创 2015-09-27 17:18:13 · 7159 阅读 · 0 评论 -
UNP服务器设计范式总结
一:客户端 本章总结的服务器程序设计范式,使用同一个客户端程序进行测试。客户端运行在和服务器处于同一个子网上的两个不同主机上。每个客户端同时派生5个子进程,每个子进程在与服务器依次建立500次连接,每次连接请求4000个字节的数据。因此,每个客户端将与服务端建立2500个连接。总共有5000次连接,而且任意时刻服务端最多存在10个连接。使用的命令如下: cl原创 2015-04-06 09:49:45 · 1153 阅读 · 0 评论 -
广播和多播
一:广播1:概述 多播支持在ipv4中是可选的,在IPv6中却是必须的; IPv6不支持广播。使用广播的任何IPv4应用程序一旦移植到IPv6就必须改用多播重新编写; 广播和多播要求用于UDP或原始IP,它们不能用于TCP。2:广播地址 广播地址有以下两种,其中-1表示索有为均为1的字段。原创 2015-04-04 21:21:18 · 1827 阅读 · 0 评论 -
原始套接字和数据链路层访问
一:原始套接字 1:原始套接字作用原始套接字提供普通的TCP和UDP套接字所不能提供的以下3种能力:有了原始套接字,进程可以读写ICMP, IGMP等分组。比如ping程序就是使用原始套接字发送ICMP回射请求并接收ICMP回射应答。有了原始套接字,进程可以读写内核不处理其协议字段的IPv4数据报。大多数内核仅仅处理IPv4协议字段为1(ICMP)、2(IGMP)、原创 2015-04-04 17:42:52 · 3069 阅读 · 0 评论 -
非阻塞模式下,虽然connect出错,但是getsockopt取得的错误却是0的问题
调试项目代码时,发现了一个奇怪问题,记录如下: 非阻塞模式下,connect发起建链,返回-1(这在非阻塞模式下是很正常的现象)。然后将该socket的写事件进行监听,在写事件触发后,getsockopt函数获取错误时,没有检测到发生错误(第三个参数返回0),最后在write操作时,发生错误。 原因:因配置文件的问题,导致得到的对端IP地址为空字符串"": struct s原创 2017-06-24 21:52:46 · 3102 阅读 · 0 评论