用Bollger记录技术之路的点滴...

关注高性能linux网络编程,NoSQL, c/c++/java ~~~ weibo @语_行 http://weibo.com/201281062~~~ twitter @JerryVector https://twitter.com/JerryVector
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

随笔分类 -  网络编程

摘要:网络编程中,我们经常讨论等待某个描述符准备好I/O(读/写)或者等待其上发生一个待处理的异常条件。尽管可读性和可写性对于普通文件这样的描述符显而易见,然而对于引起诸如select返回套接字“就绪”的条件我们必须讨论的更明确些。套接字准备好读的条件a)该套接字接受缓冲区中的数据字节数大于等于套接字接受缓冲区低水位标记的当前大小。对这样的套接字执行读操作不会阻塞并将返回一个大于0的值(也就是返回准备好读入的数据)。我们可以使用SO_RCVLOWAT套接字选项设置该套接字的低水位标记。对于tcp和udp套接字而言,其默认值为1。 b)该套接字的读半部关闭(也就是接受了FIN的tcp连接)。对这样的. 阅读全文

posted @ 2013-07-22 21:42 语行 阅读(1574) 评论(0) 推荐(0)

摘要:我们知道,一个基于TCP/IP的客户端-服务器的程序中,正常情况下,我会是启动服务器使其在一个端口上监听请求,等待客户端的连接;通过TCP的三次握手,客户端能够通过socket建立一个到服务器的连接;然后,两者就可以基于这个socket连接通信了。连接结束后,客户端(进程)会退出;在不需要继续处理客户请求的情况下,服务器(进程)也将退出。而且,当一个进程退出的时候,内核会关闭所有由这个进程打开的套接字,这里将触发TCP的四次挥手进而关闭一个socket连接。但是,在一些异常的情况下,譬如:服务器进程终止、服务器主机奔溃/奔溃后重启、服务器关机的情况下,客户端向服务器发起请求的时候,将会发生什. 阅读全文

posted @ 2013-07-03 20:58 语行 阅读(23776) 评论(0) 推荐(0)

摘要:给进程设置僵尸状态的目的是维护子进程的信息,以便父进程在以后某个时间获取。这些信息包括子进程的进程ID、终止状态以及资源利用信息(CPU时间,内存使用量等等)。如果一个进程终止,而该进程有子进程处于僵尸状态,那么它的所有僵尸子进程的父进程ID将被重置为1(init进程)。继承这些子进程的init进程将清理它们(init进程将wait它们,从而去除僵尸状态)。 但通常情况下,我们是不愿意留存僵尸进程的,它们占用内核中的空间,最终可能导致我们耗尽进程资源。那么为什么会产生僵尸进程以及如何避免产生僵尸进程呢?下边我将从这两个方面进行分析。 僵尸进程的原因 我们知道,要在当前进程中生成一个子进程,一. 阅读全文

posted @ 2013-07-01 19:52 语行 阅读(34277) 评论(4) 推荐(3)

摘要:说起TCP,我们一般都需要知道发起一个tcp连接和终止一个tcp连接是所发生的事情,下边,我将跟大家介绍下tcp的三次握手及四次挥手的过程。 TCP三路握手 (1)服务器必须准备好接受外来的连接。这通常在调用socket,bind,listen这三个函数来完成,我们称之为被动打开(passive open)。 (2)客户通过调用socket,connect发起主动打开(active open)。这导致客户tcp发送一个SYN(同步)分节,它告诉服务器客户将在待建立的tcp连接中发送数据的初始序列号。通常SYN分节不携带数据,其所在的IP数据报只包含有一个IP首部、一个TCP首部及可能有的TC. 阅读全文

posted @ 2013-06-30 11:10 语行 阅读(4352) 评论(0) 推荐(0)

摘要:信号(signal)就是通知某个进程发生了某个事件,有时也称为软件中断(software interrupt)。信号通常是异步发生的,也就是说进程预先不知道信号准确发生的时刻。 信号可以: 由一个进程发送给另一个进程(或自身)。 由内核发给某个进程。 每个信号都有一个与之关联的处置(disposition),也称为行为(action)。我们通过sigaction函数来设定一个信号的处置,并有三种选择。 1. 我们提供一个函数,他将在特定信号发生的任何时刻被调用。 2. 我们可以发某个信号设置为SIG_IGN来忽略(ignore)它。SIGKILL和SIGSTOP这两个信号不能被忽略。 3. . 阅读全文

posted @ 2013-06-28 13:50 语行 阅读(3531) 评论(0) 推荐(0)

摘要:第16章:非阻塞I/O 1: connect一个对端server,当连接成功建立的时候,套接字变为可写;当连接发生错误的时候,套接字变得既可读又可写。 阅读全文

posted @ 2013-06-08 11:14 语行 阅读(235) 评论(0) 推荐(0)

摘要:我们知道,对于一个套接字的读写(read/write)操作默认是阻塞的,如果当前套接字还不可读/写,那么这个操作会一直阻塞下去,这样对于一个需要高性能的服务器来说,是不能接受的。所以,我们可以在进行读写操作的时候可以指定超时值,这样就读写操作就不至于一直阻塞下去。 在涉及套接字的I/O操作上设置超时的方法有三种: 1:调用alarm,它在指定的超时期满时产生SIGALRM信号。这个方法涉及信号处理,而信号处理在不同的实现上存在差异,而且可能干扰进程中现有的alarm调用。 2:在select中阻塞等待I/O(select有内置的时间限制),依次代替直接阻塞在read或writ... 阅读全文

posted @ 2013-06-06 13:35 语行 阅读(3536) 评论(0) 推荐(0)

摘要:最近在追查一个代理服务器请求后端业务逻辑服务时,出现地址不可达的bug,反映到tcp这边的提示是 connection reset by peer。后来通过查看代理服务器这边的代码和业务逻辑服务器那边的代码后,发现是由于业务逻辑server那边在对一个端口设置监听的时候,对打开的socket设置了TCP_DEFER_ACCEPT这个选项,同时业务逻辑server这端对到来的tcp连接会在一个时间段后关闭这个连接。正常情况下,代理server这边有重连机制,当发现业务逻辑server那边关闭连接后,他会立即启动重连机制;但由于业务逻辑server这边对打开的socket设置了TCP_DEFE.. 阅读全文

posted @ 2013-05-30 12:59 语行 阅读(3567) 评论(0) 推荐(0)

摘要:今天用php连接最近新开发的一个服务做测试,发现命令行打印出:Cannot assign requested address网上找了下原因,大致上是由于客户端频繁的连服务器,由于每次连接都在很短的时间内结束,导致很多的TIME_WAIT,以至于用光了可用的端 口号,所以新的连接没办法绑定端口,即“Cannot assign requested address”。是客户端的问题不是服务器端的问题。通过netstat,的确看到很多TIME_WAIT状态的连接。client端频繁建立连接,而端口释放较慢,导致建立新连接时无可用端口。网上的解决方法:执行命令修改如下2个内核参数 (需要root权限)s 阅读全文

posted @ 2013-04-24 16:18 语行 阅读(79787) 评论(0) 推荐(1)

摘要:我们知道,linux下socket编程有常见的几个系统调用:对于服务器来说, 有socket(), bind(),listen(), accept(),read(),write()对于客户端来说,有socket(),connect()这里主要要讲的是客户端这边的connect函数。对于客户端来说,需要打开一个套接字,然后与对端服务器连接,例如: 1 int main(int argc, char **argv) 2 { 3 struct sockaddr_in s_addr; 4 memset(&s_addr, 0, sizeof(s_addr)); 5 ... 阅读全文

posted @ 2013-03-08 17:08 语行 阅读(26833) 评论(5) 推荐(2)