2014年2月24日

摘要: 前言 在看过前文:初探IO复用后,想必你已对IO复用这个概念有了初步但清晰的认识。接下来,我要在一个具体的并发客户端中实现它( 基于select函数 ),使得一旦服务器中的客户进程被终止的时候,客户端这边立即得到通知并返回异常。select函数 函数原型:int select ( int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout ) 包含头文件:sys/select.h sys/time.h ( 两个都要包含 ) 参数说明:maxfdp1表示监... 阅读全文
posted @ 2014-02-24 16:59 空山悟 阅读(448) 评论(0) 推荐(0) 编辑
摘要: 前言 在之前的文章中,我具体实现了一个并发回射服务器并给它加载了僵尸子进程的自动清理信号机制。在正常情况下,它已经可以很好地工作了,但它能否合理应对一些特殊情况呢?问题发现 先来看看当服务器的客户子进程突然崩溃的情况。 1. 终端启动上篇文章中已经实现了的并发服务器 2. 在另一个终端中启动... 阅读全文
posted @ 2014-02-24 15:02 空山悟 阅读(203) 评论(0) 推荐(0) 编辑
摘要: 前言 在之前的回射程序中,实现了字符串的传递与回射。幸运的是,字符串的传递不用担心不同计算机类型的大小端匹配问题,然而,如果传递二进制数据,这就是一个要好好考虑的问题。在客户端和服务器使用不同的字节序格式的情况下传递二进制数据,会导致异常。此外,客户和服务器表示整型的位数不同也可能导致传递整型异常。一个典型的错误示例( 回射程序中客户端的事务函数 ) 1 #include "unp.h" 2 3 struct args { 4 long arg1; 5 long arg2; 6 }; 7 8 struct result { 9 long sum;10 ... 阅读全文
posted @ 2014-02-24 14:57 空山悟 阅读(1140) 评论(0) 推荐(0) 编辑
摘要: 前言 在之前的文章中,我对回射程序做了分析,但那一次的分析是基于正常执行的。本文将说明在各种异常情况下该程序的执行情况。异常一 accept返回前连接终止 描述:客户端在3次握手刚好完成的时候,发出RST。参见下图: 影响:服务器端的accept函数将会返回-1,同时errno的值被置为E... 阅读全文
posted @ 2014-02-24 11:13 空山悟 阅读(347) 评论(0) 推荐(0) 编辑

2014年2月23日

摘要: 前言 在上篇中,我们已经发现了原来的并发回射程序隐藏的问题 - 僵尸子进程,而在这下篇中,我们将通过Linux的信号机制,将这些不该存于世间的“ 僵尸 ”通通清理掉。清理思路 在Linux中,每当子进程被撤销,它都会发送一个SIGCHLD信号给内核。我们只需要设置相应机制捕获这个信号然后命令系统... 阅读全文
posted @ 2014-02-23 22:08 空山悟 阅读(381) 评论(0) 推荐(0) 编辑
摘要: 前言 本文将分为两个部分,第一部分具体实现一对并发回射服务器/客户程序( 看过前面那篇文章的这部分可不看 重复了 );第二部分为服务器添加僵尸子进程自动清理机制。那么服务器具体怎么实现并发?怎么会有僵尸进程?僵尸进程又是什么?如何处理这些僵尸进程 ... 本文将为你一一解惑。回射并发服务器 功能... 阅读全文
posted @ 2014-02-23 21:04 空山悟 阅读(642) 评论(0) 推荐(1) 编辑

2014年2月22日

摘要: 执行分析 1. 打开服务器进程: 2. 执行netstat -a命令观察当前的连接状态: 第1条连接记录说明:绑定了本地主机的任意IP,端口为9877,目前处于监听状态。 3. 打开客户进程: 4. 执行netstat -a命令观察当前的连接状态,发现了两个新的连接: 以... 阅读全文
posted @ 2014-02-22 17:16 空山悟 阅读(249) 评论(0) 推荐(0) 编辑
摘要: 前言 本文将讲解一对经典的客户/服务器回射程序,感受网络编程的大致框架( 该程序稍作改装即可演变成各种提供其他服务的程序 );同时,还将对其运行过程加以分析,观察程序背后协议的执行细节,学习调试网络程序的技巧。客户端 1 #include "unp.h" 2 3 void str_cli(FILE *fp, int sockfd); 4 5 int 6 main(int argc, char **argv) 7 { 8 int sockfd; 9 struct sockaddr_in servaddr;10 11 ... 阅读全文
posted @ 2014-02-22 16:21 空山悟 阅读(438) 评论(0) 推荐(0) 编辑
摘要: 前言 知道套接字描述符,如何获取这个套接字连接的相关信息呢?显然,这是一个必须要清楚的问题。获取本地协议信息 函数原型:int getsockname ( int sockfd, struct sockaddr *localaddr, socklen_t *addrlen ) 函数功能:将本地套接字描述符sockfd对应的连接信息存放进localaddr。若成功返回0,否则返回-1。 包含头文件:sys/socket.h获取外地协议信息 函数原型:int getpeername ( int sockfd, struct sockaddr *peeraddr, socklen_t *a... 阅读全文
posted @ 2014-02-22 11:39 空山悟 阅读(275) 评论(0) 推荐(0) 编辑
摘要: 前言 一个服务器,通常会在一段时间内接收到多个请求。如果非要等到处理完一个请求再去处理下一个,势必会造成大部分用户的不满( 尤其当有某个请求需要占用大量时间时 )。如何解决这个问题?让处理这些用户请求的进程并发起来吧!实现方法 方法一:当客户请求到达,服务器进程创建一个自身副本( 调用fork函数 )。这是网络服务器的经典用法。 方法二:当客户请求到达,服务器进程创建一个自身副本( 调用fork函数 ),然后用本机内的另一个程序替换自身( 调用execve函数 )。 注:fork和execve函数均包含于 unistd.h 头文件中方法一实例代码 1 /* 2 * 仅展示处理客户请求... 阅读全文
posted @ 2014-02-22 11:37 空山悟 阅读(377) 评论(0) 推荐(0) 编辑

导航