网络编程
文章平均质量分 78
stanjiang2010
这个作者很懒,什么都没留下…
展开
-
linux的Listen调用详解
listen系统可以使一台主机上的一个tcp socket在某个端口号被动侦听,等待来自其它主机的tcp socket的连接请求,下面是listen系统调用的函数原型: #include int listen(int s, int backlog); backlog是侦听队列的长度,在内核函数中,首先对backlog作检查,如果大于128,则强制使其等于128。接下来要检查结构体struct sock的成员sk_state,即当前socket的状态,如果不为T原创 2010-07-02 18:16:00 · 15402 阅读 · 1 评论 -
对一个服务器的几步优化
<br />最近写了一个服务器,业务逻辑很简单,每个协议包往服务器上报数据, 每个数据包中可能有N块数据需要保存在数据库中的.显然, 这个业务逻辑是不能使用类似memcached这样的缓存的, 因为每条数据都是相对独立的, 而且必须保证每个数据都保存到数据库中.这里抛开服务器最基本的那些IO模型之类的不说,谈谈对这个服务器的几个优化步骤. 1) 最简单的处理最简单的处理就是按部就班的,每条数据老老实实的插入到数据库中.显然, 这样做的效率是低的, 如果并发量大的时候,mysql负载变大,而服务器阻塞在数据库转载 2010-08-23 23:26:00 · 863 阅读 · 0 评论 -
epoll为什么这么快
<br />epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,在开始讨论这个问题之前,先来解释一下为什么需要多路复用IO.<br /><br />以一个生活中的例子来解释.<br /><br />假设你在大学中读书,要等待一个朋友来访,而这个朋友只知道你在A号楼,但是不知道你具体住在哪里,于是你们约好了在A号楼门口见面.<br /><br />如果你使用的阻塞IO模型来处理这个问题,那么你就只能一直守候在A号楼门口等待朋友的到来,在这段时间里你不能转载 2010-08-23 23:20:00 · 780 阅读 · 0 评论 -
epoll学习笔记
epoll有两种模式,Edge Triggered(简称ET) 和 Level Triggered(简称LT).在采用这两种模式时要注意的是,如果采用ET模式,那么仅当状态发生变化时才会通知,而采用LT模式类似于原来的select/poll操作,只要还有没有处理的事件就会一直通知.<br /><br />以代码来说明问题:<br />首先给出server的代码,需要说明的是每次accept的连接,加入可读集的时候采用的都是ET模式,而且接收缓冲区是5字节的,也就是每次只接收5字节的数据:<br />#inc转载 2010-08-23 23:16:00 · 686 阅读 · 0 评论 -
几种分布式存储系统的分析
<br />分布式文件系统设计主要关注几个方面:<br />设计特点、分布式能力、性能、容灾、维护和扩展、成本<br /> <br />分布式文件系统主要关键技术:<br />全局名字空间、缓存一致性、安全性、可用性、可扩展性<br /> <br />其他关键技术:<br />文件系统的快照和备份技术、热点文件处理技术、元数据集群的负载平衡技术、分布式文件系统的日志技术<br /> <br /> <br />一、GFS(google file system)<br />GFS与过去的分布式文件系统有很多相同转载 2010-12-31 00:02:00 · 28132 阅读 · 1 评论 -
Google Protocol Buffer 的使用和原理
<br /><br />很详细的关于protobuff的介绍,先收藏之!<br /> <br />简介<br />什么是 Google Protocol Buffer? 假如您在网上搜索,应该会得到类似这样的文字介绍:<br />Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 个 .proto 文件。他们用于 RPC 系统和持续数据存储系统。<br />Prot转载 2011-05-17 22:54:00 · 1302 阅读 · 0 评论 -
protobuf在网络编程中的应用思考
<br />protobuf简介<br />protobuf是google提供的一个开源序列化框架,类似于XML,JSON这样的数据表示语言,其最大的特点是基于二进制,因此比传统的XML表示高效短小得多。虽然是二进制数据格式,但并没有因此变得复杂,开发人员通过按照一定的语法定义结构化的消息格式,然后送给命令行工具,工具将自动生成相关的类,可以支持java、c++、python等语言环境。通过将这些类包含在项目中,可以很轻松的调用相关方法来完成业务消息的序列化与反序列化工作。<br />protobuf在go转载 2011-05-17 22:58:00 · 1072 阅读 · 0 评论 -
走进boost
<br /><br />一直流传这么一个说法,想成为高手,一定要多读高手写的源代码。哪些代码是好材料呢?C++标准库的源代码?不,如果您读过,就会发现:要么是各种实现独有的表达方式让人摸不着头脑,要么是恐怖的代码风格(如到处是下划线)憋得人难受。Boost库的代码则相当清晰,注释合理,命名规范,绝对是适合阅读的典范。同时,Boost内容广泛,数值计算、泛型编程、元编程、平台API……不妨从容选择自己感兴趣的部分,细细品味。 <br /><br />Boost是什么?一套开放源代码、高度可移植的C++库。 <转载 2011-05-18 09:58:00 · 2508 阅读 · 0 评论 -
HTTP幂等性概念和应用
基于HTTP协议的Web API是时下最为流行的一种分布式服务提供方式。无论是在大型互联网应用还是企业级架构中,我们都见到了越来越多的SOA或RESTful的Web API。为什么Web API如此流行呢?我认为很大程度上应归功于简单有效的HTTP协议。HTTP协议是一种分布式的面向资源的网络应用层协议,无论是服务器端提供Web服务,还是客户端消费Web服务都非常简单。再加上浏览器、Javas转载 2011-06-07 20:05:00 · 2444 阅读 · 0 评论 -
多进程服务器中,epoll的创建应该在创建子进程之后
<br />看我的测试代码,似乎应该是在创建子进程之后创建epoll的fd,否则程序将会有问题,试将代码中两个CreateWorker函数的调用位置分别调用,一个在创建epoll fd之前,一个在之后,在调用在创建之前的代码会出问题,在我的机器上(linux内核2.6.26)表现的症状就是所有进程的epoll_wait函数返回0, 而客户端似乎被阻塞了:<br /><br />服务器端:#include <iostream><br />#include <sys/socket.h><br />#includ转载 2010-08-23 23:19:00 · 829 阅读 · 0 评论 -
Linux下面socket编程的非阻塞TCP研究
<br /> <br /> tcp协议本身是可靠的,并不等于应用程序用tcp发送数据就一定是可靠的.不管是否阻塞,send发送的大小,并不代表对端recv到多少的数据。<br /> 在阻塞模式下, send函数的过程是将应用程序请求发送的数据拷贝到发送缓存中发送并得到确认后再返回.但由于发送缓存的存在,表现为:如果发送缓存大小比请求发送的大小要大,那么send函数立即返回,同时向网络中发送数据;否则,send向网络发送缓存中不能容纳的那部分数据,并等待对端确认后再返回(接收端只要将数据收转载 2010-06-23 15:31:00 · 1074 阅读 · 0 评论 -
共享内存学习小结(二)
这是一篇来自IBM工程师对共享内存的应用心得,其工作的OS是基于IBM自己的AIX。简介共享内存是一种非常重要且常用的进程间通信方式,相对于其它IPC机制,因其速度最快、效率最高,被广泛应用于各类软件产品及应用开发中。System V IPC 为UNIX平台上的共享内存应用制定了统一的API标准,从而为在UNIX/Linux平台上进行跨平台开发提供了极大的便利;开发人员基于一套基本相同的源代码,便可开发出同时支持AIX、Solaris、HP-UX、Linux等平台的产品。然而,各个平台对Syst转载 2010-06-18 11:50:00 · 3035 阅读 · 0 评论 -
TCP状态变迁图学习小结
<br />这是网络编程的基础,tcp的状态转移图说到底就是一个状态机的不同状态之间的转换关系以及触发这些状态需要的条件,一共存在11个状态,我们来逐一分析: <br /><br />1.CLOSED:起始点,在超时或者连接关闭时候进入此状态。 <br />2.LISTEN:svr端在等待连接过来时候的状态,svr端为此要调用socket, bind,listen函数,就能进入此状态。此称为应用程序被动打开(等待客户端来连接)。 <br />3.SYN_SENT:客户端发起连接,发送SYN给服务器端。如果服转载 2010-06-17 17:56:00 · 1926 阅读 · 0 评论 -
Linux下getsockopt和setsockopt小结
<br />功能描述:<br /> 获取或者设置与某个套接字关联的选 项。选项可能存在于多层协议中,它们总会出现在最上面的套接字层。当操作套接字选项时,选项位于的层和选项的名称必须给出。为了操作套接字层的选项,应该 将层的值指定为SOL_SOCKET。为了操作其它层的选项,控制选项的合适协议号必须给出。例如,为了表示一个选项由TCP协议解析,层应该设定为协议 号TCP。<br /><br />用法:<br />#include <sys/types.h><br />#include <sys/转载 2010-06-22 18:17:00 · 1500 阅读 · 0 评论 -
epoll的ET和LT模式详解
<br />从man手册中,得到ET和LT的具体描述如下<br />EPOLL事件有两种模型:<br />Edge Triggered (ET)<br />Level Triggered (LT)<br />假如有这样一个例子:<br />1. 我们已经把一个用来从管道中读取数据的文件句柄(RFD)添加到epoll描述符<br />2. 这个时候从管道的另一端被写入了2KB的数据<br />3. 调用epoll_wait(2),并且它会返回RFD,说明它已经准备好读取操作<br />4. 然后我们读取了1K转载 2010-06-22 19:32:00 · 776 阅读 · 0 评论 -
Socket编程中的EAGAIN
<br /> 在Linux中使用非阻塞的socket的情形下。<br />(一)发送时<br />当客户通过Socket提供的send函数发送大的数据包时,就可能返回一个EGGAIN的错误。该错误产生的原因是由于send函数中的size变量大小超过了tcp_sendspace的值。tcp_sendspace定义了应用在调用send之前能够在kernel中缓存的数据量。当应用程序在socket中设置了O_NDELAY或者O_NONBLOCK属性后,如果发送缓存被占满,send就会返回EAGAIN的错误。<b原创 2010-06-23 14:58:00 · 1704 阅读 · 0 评论 -
epoll使用详解
<br />epoll - I/O event notification facility<br />在linux的网络编程中,很长的时间都在使用select来做事件触发。在linux新的内核中,有了一种替换它的机制,就是epoll。<br />相比于select,epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。因为在内核中的select实现中,它是采用轮询来处理的,轮询的fd数目越多,自然耗时越多。并且,在linux/posix_types.h头文件有这样的声明:<br />#define转载 2010-06-22 19:31:00 · 759 阅读 · 0 评论 -
关于Linux常用的二进制文件分析方法
当你在unix下拿到一个二进制文件但不知道它是什么的时候,可以通过以下方法得到一此提示 1、 最首先应该尝试strings命令,比如拿到一个叫cr1的二进制文件,可以: $ strings cr1 | more 里面可能会有一些对于这个cr1的描述,这些信息都是编译之后在程序中留下的一些文本性的说明,所以可能会告诉你这个文件是什么. 比如有输出:转载 2011-06-22 10:58:00 · 4698 阅读 · 0 评论