上一页 1 ··· 3 4 5 6 7 8 9 10 11 ··· 61 下一页
  2012年11月8日
摘要: 在 4.2 BSD UNIX® 操作系统中首次引入,Sockets API 现在是任何操作系统的标准特性。事实上,很难找到一种不支持 Sockets API 的现代语言。该 API 相当简单,但新的开发人员仍然会遇到一些常见的隐患。本文识别那些隐患并向您显示如何避开它们。隐患 1.忽略返回状态第一个隐患很明显,但它是开发新手最容易犯的一个错误。如果您忽略函数的返回状态,当它们失败或部分成功的时候,您也许会迷失。反过来,这可能传播错误,使定位问题的源头变得困难。捕获并检查每一个返回状态,而不是忽略它们。考虑清单 1 显示的例子,一个套接字 send 函数。清单 1. 忽略 API 函数 阅读全文
posted @ 2012-11-08 17:19 carekee 阅读(397) 评论(0) 推荐(0) 编辑
摘要: 介绍 Socket 编程让你沮丧吗?从man pages中很难得到有用的信息吗?你想跟上时代去编Internet相关的程序,但是为你在调用 connect() 前的bind() 的结构而不知所措?等等… 好在我已经将这些事完成了,我将和所有人共享我的知识了。如果你了解 C 语言并想穿过网络编程的沼泽,那么你来对地方了。////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////读者对象 这个文档是一个指南.. 阅读全文
posted @ 2012-11-08 17:16 carekee 阅读(390) 评论(0) 推荐(0) 编辑
摘要: 看我的测试代码,似乎应该是在创建子进程之后创建epoll的fd,否则程序将会有问题,试将代码中两个CreateWorker函数的调用位置分别调用,一个在创建epoll fd之前,一个在之后,在调用在创建之前的代码会出问题,在我的机器上(linux内核2.6.26)表现的症状就是所有进程的epoll_wait函数返回0, 而客户端似乎被阻塞了:服务器端:#include<iostream>#include<sys/socket.h>#include<sys/epoll.h>#include<netinet/in.h>#include<arpa 阅读全文
posted @ 2012-11-08 17:14 carekee 阅读(343) 评论(0) 推荐(0) 编辑
摘要: epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,在开始讨论这个问题之前,先来解释一下为什么需要多路复用IO.以一个生活中的例子来解释.假设你在大学中读书,要等待一个朋友来访,而这个朋友只知道你在A号楼,但是不知道你具体住在哪里,于是你们约好了在A号楼门口见面.如果你使用的阻塞IO模型来处理这个问题,那么你就只能一直守候在A号楼门口等待朋友的到来,在这段时间里你不能做别的事情,不难知道,这种方式的效率是低下的.现在时代变化了,开始使用多路复用IO模型来处理这个问题.你告诉你的朋友来了A号楼找楼管大妈,让她告诉你该怎么走.这里的楼管大妈 阅读全文
posted @ 2012-11-08 17:13 carekee 阅读(297) 评论(0) 推荐(0) 编辑
摘要: epoll有两种模式,Edge Triggered(简称ET) 和 Level Triggered(简称LT).在采用这两种模式时要注意的是,如果采用ET模式,那么仅当状态发生变化时才会通知,而采用LT模式类似于原来的 select/poll操作,只要还有没有处理的事件就会一直通知.以代码来说明问题:首先给出server的代码,需要说明的是每次accept的连接,加入可读集的时候采用的都是ET模式,而且接收缓冲区是5字节的,也就是每次只接收5字节的数据:#include<iostream>#include<sys/socket.h>#include<sys/epo 阅读全文
posted @ 2012-11-08 17:12 carekee 阅读(187) 评论(0) 推荐(0) 编辑
摘要: 学习epoll有一段时间了,最近终于有一个服务器采用了epoll模型,从中积累了一些epoll的资料.个人感觉目前可以找到的epoll相关的资料太少了,因为epoll仅被linux 2.6以上版本内核所支持,它的应用时间还比较短暂, 而一些讲解网络编程的相关权威书籍(如已逝的stevens的UNP)都没有讲解这个不能跨unix平台的专有技术,而epoll带来的巨大效率提高又使得这项技术很有吸引力, 于是我决定将个人遇到的epoll相关问题整理一下, 随着对epoll的理解深入, 这份资料将不断的完善下去.需要说明的是, 这份教材不适合网络编程的初学者, 这里假设读者具备一定的网络编程基础, 使 阅读全文
posted @ 2012-11-08 17:11 carekee 阅读(276) 评论(1) 推荐(0) 编辑
摘要: 导读: 1.Socket简介 Socket是TCP/IP网络的API,可以用它来开发网络应用程序,Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符 2.Socket的建立 int socket(int domain, int type, int protocol) 函数返回:一个整型的Socket描述符,可以在后面调用它。 参数说明: int domain:指明所使用的协议族, 通常是PF_INET, 表示网络(TCP/IP)协议族说明我们网络程序所在的主机采用的通讯协族(AF_UNIX和AF_INET等). AF_UNIX:只能够用于单一... 阅读全文
posted @ 2012-11-08 17:09 carekee 阅读(432) 评论(0) 推荐(0) 编辑
摘要: 在陆续写了《epoll模型编程的几个问题》《epoll模型编程的几个问题2》后,发现epoll有些不理解的地方。今天,深入了解了epoll的事件机制,发现epoll有两种事事件触发机制。一是边沿触发(edge triggered),一是电平触发(levle triggered)。写文一篇《epoll编程终结者》,以总结并终结之epoll的核心就是其事件机制,所以只有很好的了解其事件机制,才能更好的使用epoll.epoll的事件分发机制分为两种一是边沿触发(edge triggered),一是电平触发(levle triggered,所谓电平触发并不是真的要用电平来触发,而是相对于边沿触发而言 阅读全文
posted @ 2012-11-08 17:08 carekee 阅读(314) 评论(0) 推荐(0) 编辑
摘要: 翻译的man epoll的:在man epoll中的Notes说到:EPOLL事件分发系统可以运转在两种模式下: Edge Triggered (ET) Level Triggered (LT)接下来说明ET, LT这两种事件分发机制的不同。我们假定一个环境:1. 我们已经把一个用来从管道中读取数据的文件句柄(RFD)添加到epoll描述符2. 这个时候从管道的另一端被写入了2KB的数据3. 调用epoll_wait(2),并且它会返回RFD,说明它已经准备好读取操作4. 然后我们读取了1KB的数据5. 调用epoll_wait(2)......Edge Triggered 工作模式:如果我们 阅读全文
posted @ 2012-11-08 17:05 carekee 阅读(1392) 评论(0) 推荐(0) 编辑
摘要: 在Linux上开发网络服务器的一些相关细节(1)------poll与epolldugang@188.com 随着2.6内核对epoll的完全支持,网络上很多的文章和示例代码都提供了这样一个信息:使用epoll代替传统的poll能给网络服务应用带来性能上的提升。但大多文章里关于性能提升的原因解释的较少,这里我将试分析一下内核(2.6.21.1)代码中poll与epoll的工作原理,然后再通过一些测试数据来对比具体效果。 POLL: 先说poll,poll或select为大部分Unix/Linux程序员所熟悉,这俩个东西原理类似,性能上也不存在明显差异,但select对所监控的文件描述符数... 阅读全文
posted @ 2012-11-08 17:01 carekee 阅读(234) 评论(0) 推荐(0) 编辑
摘要: epoll是Linux内核为处理大批量句柄而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著减少程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。一、epoll的优点支持一个进程打开大数目的socket描述符。IO效率不随FD数目增加而线性下降。内核微调。二、epoll的使用epoll有2种工作方式:LT和ET。 LT(leveltriggered,水平触发)是缺省的工作方式,并且同时支持block和no-blocksocket.在这种做法中,内核告诉你一个文件描述符是否就绪了,然后你可以对这个就绪的fd进行IO操作。如果你不作任何操作,. 阅读全文
posted @ 2012-11-08 16:58 carekee 阅读(3157) 评论(0) 推荐(0) 编辑
摘要: epoll用到的所有函数都是在头文件sys/epoll.h中声明的,下面简要说明所用到的数据结构和函数:所用到的数据结构typedef union epoll_data { void *ptr; int fd; __uint32_t u32; __uint64_t u64; } epoll_data_t; struct epoll_event { __uint32_t events; /* Epoll events */ epoll_data_t data; /* User data variable */ };结构体epoll_event 被用于注册所感兴趣的事件和回传所发生待处理的事件,其 阅读全文
posted @ 2012-11-08 16:43 carekee 阅读(717) 评论(0) 推荐(0) 编辑
摘要: IO 多路转接 当从一个文件描述符读,然后写到另一个文件描述符,可以在下列形式的循环中使用阻塞IO。while((n = read(STDIN_FILENO, buf, BUFSIZ)) > 0) if(write(STDOUT_FILENO, buf, n) != n) err_sys("write error");但是,如果必须从两个描述符读,那么就可能长时间阻塞在一个描述符上,而另一个描述符虽然有很多数据却不能得到及时处理。 IO多路转接(I/O Multiplexing),先构造一张有关描述符的列表,然后调用一个函数,直到这些描述符中的一个已准备好进行I/O时 阅读全文
posted @ 2012-11-08 15:27 carekee 阅读(426) 评论(0) 推荐(0) 编辑
摘要: Select函数使用简单,其工作原理大家通常也知道,但是在实际的使用过程中可能并没有严格遵守,而且确实也比较难以完全遵守,除非不使用它。Select采用一个bit表,每个fd对应表中的一个bit位,宏FD_SETSIZE为表的大小,添加到fd_set中的fd值必须小于FD_SETSIZE,否则就会越界,假设有如下一段代码:fd_setreadfds;FD_ZERO(&readfds);FD_SET(fd,&readfds);那么,这里的fd必须满足:fd<FD_SETSIZE,否则即会发生越界,使用valgrind和purify等内存检测工具能够检测到这个问题,但通常很少 阅读全文
posted @ 2012-11-08 15:24 carekee 阅读(655) 评论(0) 推荐(0) 编辑
摘要: 前言: 在很多比较各种网络模型的文章中,但凡提到select模型时,都会说select受限于轮询的套接字数量,这个数量也就是系统头文件中定义的FD_SETSIZE值(例如64)。但事实上这个算不上真的限制。 C语言的偏方: 在C语言的世界里存在一个关于结构体的偏门技巧,例如: typedef struct _str_type{ int _len; char _s[1];}str_type; str_type用于保存字符串(我只是举例,事实上这个结构体没什么用处),乍看上去str_type只能保存长度为1的字符串('\0')。但是,通过写下如下的代码,你将突破这个限制: int 阅读全文
posted @ 2012-11-08 15:23 carekee 阅读(380) 评论(0) 推荐(0) 编辑
摘要: 关于这个话题网上流传的是一个相同的版本,就是那个第一项是头文件的区别,但后面列出的头文件只有#include没有(估计是原版的在不断转载的过程中有人不小心忘了把尖括号转义,让浏览器当html标记解析没了)的那个。现在整理了一下,以后也会不断补充内容。 1)头文件 windows下winsock.h或winsock2.hlinux下netinet/in.h(大部分都在这儿),unistd.h(close函数在这儿),sys/socket.h(在in.h里已经包含了,可以省了)2)初始化windows下需要用WSAStartup启动Ws2_32.lib,并且要用#pragma comment(li 阅读全文
posted @ 2012-11-08 15:20 carekee 阅读(1293) 评论(0) 推荐(0) 编辑
摘要: 1.closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket:BOOL bReuseaddr=TRUE;setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL));2. 如果要已经处于连接状态的soket在调用closesocket后强制关闭,不经历TIME_WAIT的过程:BOOL bDontLinger = FALSE;setsockopt(s,SOL_SOCKET,SO_DONTLINGER,(const char*)&bDontLing 阅读全文
posted @ 2012-11-08 15:18 carekee 阅读(412) 评论(0) 推荐(0) 编辑
摘要: 一.socket的一些基本结构1.32位的IP地址:struct in_addr{ unsigned long s_addr;}2.TCP/IP所在的网际通信域使用的套接字地址格式:struct sockaddr_in{ short int sin_family; //表示所属地址簇,TCP/IP必须是AF_INET unsigned short int sin_port; //表示端口号 struct in_addr sin_addr; //表示32位的IP地址,用in_addr结构表示 unsigned char sin_zero[8]; //表示全部填充0,保证和sockaddr大小相. 阅读全文
posted @ 2012-11-08 15:18 carekee 阅读(328) 评论(0) 推荐(0) 编辑
摘要: 1. 如果在已经处于 ESTABLISHED状态下的socket(一般由端口号和标志符区分)调用closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket则: BOOL bReuseaddr=TRUE;setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL));2. 如果要已经处于连接状态的soket在调用closesocket后强制关闭,不经历TIME_WAIT的过程则: BOOLbDtLger = FALSE; setsockopt(s,SOL_SO 阅读全文
posted @ 2012-11-08 15:17 carekee 阅读(411) 评论(0) 推荐(0) 编辑
摘要: 终于开始学习epoll了,虽然不明白的地方还是很多,但从理论到实践,相信自己动手去写一个具体的框架后,一切会清晰很多。1、首先需要一个内存池,目的在于:·减少频繁的分配和释放,提高性能的同时,还能避免内存碎片的问题;·能够存储变长的数据,不要很傻瓜地只能预分配一个最大长度;·基于SLAB算法实现内存池是一个好的思路:分配不同大小的多个块,请求时返回大于请求长度的最小块即可,对于容器而言,处理固定块的分配和回收,相当容易实现。当然,还要记得需要设计成线程安全的,自旋锁比较好,使用读写自旋锁就更好了。·分配内容的增长管理是一个问题,比如第一次需要1KB空间, 阅读全文
posted @ 2012-11-08 15:14 carekee 阅读(530) 评论(0) 推荐(0) 编辑
上一页 1 ··· 3 4 5 6 7 8 9 10 11 ··· 61 下一页