TCP客户--服务器程序示例
摘要:1. TCP回射示例服务器代码View Code #include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/socket.h>#include <arpa/inet.h>#include <netinet/in.h>#define SRV_PORT 8888#define MAXLINE 4096void str_echo(int fd);int main(int argc, char **argv){ int listenfd = sock
阅读全文
posted @
2013-02-06 13:34
carekee
阅读(787)
推荐(0) 编辑
EPIPE和ECONNRESET
摘要:page1:假设Server A上面有Process X,它有一个socket M,和另外的Server B上面的Process Y的 Socket N以TCP协议连接上了,那么,据我所知,有2种情况会出现RST包:(1)X没有close socket就退出了,然后Y继续向M send数据,A的内核就会发送RST 到 socket N;(2)X设置了SO_LINGER,其中l_onoff 非0, l_linger 为0,这样当A close socket M的时候,也会发送RST到socket N。当socket N收到了RST,select的结果为socket可读,则:(a)如果这个时候调用
阅读全文
posted @
2013-02-06 13:30
carekee
阅读(11997)
推荐(1) 编辑
readn writen实现linux下socket缓冲区读写
摘要:socket上的read write操作不同与一般的文件IO操作,socket上的用read write读写的字节数可能比要求的少,但这并不是错误,原因是socket的缓冲区可能已经到达了极限。此时所需要的就是再次调用read write以写入或输出剩余的字符。这种情况下在socket中很常见,但在写字节流socket时只能在socket非阻塞的情况下才会出现,然而为预防实现万一返回不足的字符数值,我们总是调用writen和readn函数,而不是read和write.下面就是readn、writen函数源码:ssize_t /* Read "n" bytes from a
阅读全文
posted @
2013-02-05 17:57
carekee
阅读(1714)
推荐(0) 编辑
Epoll在LT和ET模式下的读写方式
摘要:在一个非阻塞的socket上调用read/write函数, 返回EAGAIN或者EWOULDBLOCK(注: EAGAIN就是EWOULDBLOCK)从字面上看, 意思是:EAGAIN: 再试一次,EWOULDBLOCK: 如果这是一个阻塞socket, 操作将被block,perror输出: Resource temporarily unavailable总结:这个错误表示资源暂时不够,能read时,读缓冲区没有数据,或者write时,写缓冲区满了。遇到这种情况,如果是阻塞socket,read/write就要阻塞掉。而如果是非阻塞socket,read/write立即返回-1, 同时err
阅读全文
posted @
2012-12-12 14:40
carekee
阅读(300)
推荐(0) 编辑
Linux 套接字编程中的 5 个隐患
摘要:在 4.2 BSD UNIX® 操作系统中首次引入,Sockets API 现在是任何操作系统的标准特性。事实上,很难找到一种不支持 Sockets API 的现代语言。该 API 相当简单,但新的开发人员仍然会遇到一些常见的隐患。本文识别那些隐患并向您显示如何避开它们。隐患 1.忽略返回状态第一个隐患很明显,但它是开发新手最容易犯的一个错误。如果您忽略函数的返回状态,当它们失败或部分成功的时候,您也许会迷失。反过来,这可能传播错误,使定位问题的源头变得困难。捕获并检查每一个返回状态,而不是忽略它们。考虑清单 1 显示的例子,一个套接字 send 函数。清单 1. 忽略 API 函数
阅读全文
posted @
2012-11-08 17:19
carekee
阅读(397)
推荐(0) 编辑
Beej网络socket编程指南
摘要:介绍 Socket 编程让你沮丧吗?从man pages中很难得到有用的信息吗?你想跟上时代去编Internet相关的程序,但是为你在调用 connect() 前的bind() 的结构而不知所措?等等… 好在我已经将这些事完成了,我将和所有人共享我的知识了。如果你了解 C 语言并想穿过网络编程的沼泽,那么你来对地方了。////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////读者对象 这个文档是一个指南..
阅读全文
posted @
2012-11-08 17:16
carekee
阅读(392)
推荐(0) 编辑
多进程服务器中,epoll的创建应该在创建子进程之后
摘要:看我的测试代码,似乎应该是在创建子进程之后创建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) 编辑
epoll为什么这么快
摘要:epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,在开始讨论这个问题之前,先来解释一下为什么需要多路复用IO.以一个生活中的例子来解释.假设你在大学中读书,要等待一个朋友来访,而这个朋友只知道你在A号楼,但是不知道你具体住在哪里,于是你们约好了在A号楼门口见面.如果你使用的阻塞IO模型来处理这个问题,那么你就只能一直守候在A号楼门口等待朋友的到来,在这段时间里你不能做别的事情,不难知道,这种方式的效率是低下的.现在时代变化了,开始使用多路复用IO模型来处理这个问题.你告诉你的朋友来了A号楼找楼管大妈,让她告诉你该怎么走.这里的楼管大妈
阅读全文
posted @
2012-11-08 17:13
carekee
阅读(299)
推荐(0) 编辑
epoll学习笔记
摘要: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) 编辑
epoll相关资料整理
摘要:学习epoll有一段时间了,最近终于有一个服务器采用了epoll模型,从中积累了一些epoll的资料.个人感觉目前可以找到的epoll相关的资料太少了,因为epoll仅被linux 2.6以上版本内核所支持,它的应用时间还比较短暂, 而一些讲解网络编程的相关权威书籍(如已逝的stevens的UNP)都没有讲解这个不能跨unix平台的专有技术,而epoll带来的巨大效率提高又使得这项技术很有吸引力, 于是我决定将个人遇到的epoll相关问题整理一下, 随着对epoll的理解深入, 这份资料将不断的完善下去.需要说明的是, 这份教材不适合网络编程的初学者, 这里假设读者具备一定的网络编程基础, 使
阅读全文
posted @
2012-11-08 17:11
carekee
阅读(280)
推荐(0) 编辑
linux下socket通信概述
摘要:导读: 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
阅读(435)
推荐(0) 编辑
epoll编程终结者
摘要:在陆续写了《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
阅读(316)
推荐(0) 编辑
epoll用法注意的问题
摘要:翻译的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
阅读(1394)
推荐(0) 编辑
在Linux上开发网络服务器的一些相关细节(1):poll与epoll
摘要:在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
阅读(235)
推荐(0) 编辑
Linux中epoll用法小结
摘要: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
阅读(3193)
推荐(0) 编辑
epoll用法说明(源代码)
摘要: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
阅读(730)
推荐(0) 编辑
select,poll和epoll使用
摘要: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
阅读(428)
推荐(0) 编辑
Linux下select调用引发的血案
摘要: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
阅读(659)
推荐(0) 编辑
突破select的FD_SETSIZE限制
摘要:前言: 在很多比较各种网络模型的文章中,但凡提到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
阅读(392)
推荐(0) 编辑
Socket程序从windows移植到linux下需要注意的
摘要:关于这个话题网上流传的是一个相同的版本,就是那个第一项是头文件的区别,但后面列出的头文件只有#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
阅读(1302)
推荐(0) 编辑