随笔分类 -  已迁移至(博客园_穆晨)

基础的经典的UNIX/Linux网络编程专题 【注】:如需运行代码,请搭建《UNIX 网络编程》一书中要求的编译环境。
基于UDP的一对回射客户/服务器程序
摘要:前言 之前曾经学习过一对回射客户/服务器程序的例子,不过那个是基于TCP协议的。本文将讲解另一对回射客户/服务器程序,该程序基于UDP协议。由于使用的协议不同,因此编写出的程序也有本质上的区别,应将它们对比来进行理解。通信框架 服务器端 1 #include "unp.h" 2 3 int 4 main(int argc, char **argv) 5 { 6 int sockfd; 7 struct sockaddr_in servaddr, cliaddr; 8 9 // 创建UDP套接字10 soc... 阅读全文

posted @ 2014-04-13 00:23 空山悟 阅读(799) 评论(0) 推荐(0)

启用/查看套接字选项的方法
摘要:前言 在网络套接字编程中,我们可以通过设置套接字选项让网络协议按照我们预想的方式工作。本文教你如何获取当前的套接字选项,以及如何设置套接字选项。涉及函数 以下两个函数包含在头文件 sys/socket.h 中 1. int getsockopt ( int sockfd, int level,... 阅读全文

posted @ 2014-04-02 16:11 空山悟 阅读(521) 评论(0) 推荐(0)

不为客户连接创建子进程的并发回射服务器( poll实现 )
摘要:前言 在上文中,我使用select函数实现了不为客户连接创建子进程的并发回射服务器( 点此进入 )。但其中有个细节确实有点麻烦,那就是还得设置一个client数组用来标记select监听描述符集中被设置为监听位的位。有没有方法简化这个处理呢?有!在《UNIX网络编程》第六章最后介绍了一种类似select的函数 --- poll函数,用它来实现IO复用使代码简化了不少( 起码并发回射服务器的例子是的 )。poll函数介绍 1. 包含头文件: 2. 函数原型:int poll ( struct pollfd * fdarray, unsigned long nfds, int timeout... 阅读全文

posted @ 2014-02-24 21:57 空山悟 阅读(278) 评论(0) 推荐(0)

不为客户连接创建子进程的并发回射服务器( select实现 )
摘要:前言 在此前,我已经介绍了一种并发回射服务器实现( 点此进入 )。它通过调用fork函数为每个客户请求创建一个子进程。同时,我还为此服务器添加了自动消除僵尸子进程的机制。现在请想想,在客户量非常大的情况下,这种为每个客户请求都创建子进程的做法是不是太费资源了?我们可不可以在不为每个客户请求都创建子进程的前提下实现并发回射服务器?答案自然是肯定的,这也是此文要讲述的方法。实现思路 服务器建立好监听套接字之后,进入以下循环中: 1. 调用select函数,先使之阻塞于监听套接字描述符( 之后阻塞于监听套接字描述符和已连接套接字描述符 )。 2. 当监听套接字描述符被激活,就调用connec... 阅读全文

posted @ 2014-02-24 21:28 空山悟 阅读(392) 评论(0) 推荐(0)

批量处理情况下的回射客户端
摘要:前言 批量处理是指将原先的输入重定向到一个输入文件,这样客户端将连续向服务器发送该文件中的数据,然后接收到服务器的回射数据后,再将其写入到另一个文件中。在这样的情况下,原来的客户端程序不能够再正确运行了。那么会发生什么问题?我们又该如何修改客户端程序才能使之正确工作呢?且看下文。发现问题一 传输线路中数据的丢失 先来看看原客户端中的数据处理函数的一段: 1 if (FD_ISSET(sockfd, &rset)) { 2 if (Readline(sockfd, recvline, MAXLINE) == 0) 3 err_q... 阅读全文

posted @ 2014-02-24 21:03 空山悟 阅读(281) 评论(0) 推荐(0)

IO复用之select实现
摘要:前言 在看过前文:初探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 空山悟 阅读(465) 评论(0) 推荐(0)

初探IO复用
摘要:前言 在之前的文章中,我具体实现了一个并发回射服务器并给它加载了僵尸子进程的自动清理信号机制。在正常情况下,它已经可以很好地工作了,但它能否合理应对一些特殊情况呢?问题发现 先来看看当服务器的客户子进程突然崩溃的情况。 1. 终端启动上篇文章中已经实现了的并发服务器 2. 在另一个终端中启动... 阅读全文

posted @ 2014-02-24 15:02 空山悟 阅读(213) 评论(0) 推荐(0)

关于TCP通信程序中数据的传递格式
摘要:前言 在之前的回射程序中,实现了字符串的传递与回射。幸运的是,字符串的传递不用担心不同计算机类型的大小端匹配问题,然而,如果传递二进制数据,这就是一个要好好考虑的问题。在客户端和服务器使用不同的字节序格式的情况下传递二进制数据,会导致异常。此外,客户和服务器表示整型的位数不同也可能导致传递整型异常。一个典型的错误示例( 回射程序中客户端的事务函数 ) 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 空山悟 阅读(1153) 评论(0) 推荐(0)

回射程序中的异常分析
摘要:前言 在之前的文章中,我对回射程序做了分析,但那一次的分析是基于正常执行的。本文将说明在各种异常情况下该程序的执行情况。异常一 accept返回前连接终止 描述:客户端在3次握手刚好完成的时候,发出RST。参见下图: 影响:服务器端的accept函数将会返回-1,同时errno的值被置为E... 阅读全文

posted @ 2014-02-24 11:13 空山悟 阅读(367) 评论(0) 推荐(0)

并发回射服务器的具体实现及其中僵尸子进程的清理( 下 )
摘要:前言 在上篇中,我们已经发现了原来的并发回射程序隐藏的问题 - 僵尸子进程,而在这下篇中,我们将通过Linux的信号机制,将这些不该存于世间的“ 僵尸 ”通通清理掉。清理思路 在Linux中,每当子进程被撤销,它都会发送一个SIGCHLD信号给内核。我们只需要设置相应机制捕获这个信号然后命令系统... 阅读全文

posted @ 2014-02-23 22:08 空山悟 阅读(400) 评论(0) 推荐(0)

并发回射服务器的具体实现及其中僵尸子进程的清理( 上 )
摘要:前言 本文将分为两个部分,第一部分具体实现一对并发回射服务器/客户程序( 看过前面那篇文章的这部分可不看 重复了 );第二部分为服务器添加僵尸子进程自动清理机制。那么服务器具体怎么实现并发?怎么会有僵尸进程?僵尸进程又是什么?如何处理这些僵尸进程 ... 本文将为你一一解惑。回射并发服务器 功能... 阅读全文

posted @ 2014-02-23 21:04 空山悟 阅读(663) 评论(0) 推荐(1)

基于TCP的一对回射客户/服务器程序及其运行过程分析( 下 )
摘要:执行分析 1. 打开服务器进程: 2. 执行netstat -a命令观察当前的连接状态: 第1条连接记录说明:绑定了本地主机的任意IP,端口为9877,目前处于监听状态。 3. 打开客户进程: 4. 执行netstat -a命令观察当前的连接状态,发现了两个新的连接: 以... 阅读全文

posted @ 2014-02-22 17:16 空山悟 阅读(262) 评论(0) 推荐(0)

基于TCP的一对回射客户/服务器程序及其运行过程分析( 上 )
摘要:前言 本文将讲解一对经典的客户/服务器回射程序,感受网络编程的大致框架( 该程序稍作改装即可演变成各种提供其他服务的程序 );同时,还将对其运行过程加以分析,观察程序背后协议的执行细节,学习调试网络程序的技巧。客户端 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 空山悟 阅读(454) 评论(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 空山悟 阅读(286) 评论(0) 推荐(0)

并发回射服务器的最基本实现思路( fork )
摘要:前言 一个服务器,通常会在一段时间内接收到多个请求。如果非要等到处理完一个请求再去处理下一个,势必会造成大部分用户的不满( 尤其当有某个请求需要占用大量时间时 )。如何解决这个问题?让处理这些用户请求的进程并发起来吧!实现方法 方法一:当客户请求到达,服务器进程创建一个自身副本( 调用fork函数 )。这是网络服务器的经典用法。 方法二:当客户请求到达,服务器进程创建一个自身副本( 调用fork函数 ),然后用本机内的另一个程序替换自身( 调用execve函数 )。 注:fork和execve函数均包含于 unistd.h 头文件中方法一实例代码 1 /* 2 * 仅展示处理客户请求... 阅读全文

posted @ 2014-02-22 11:37 空山悟 阅读(386) 评论(0) 推荐(0)

几个经典的TCP通信函数
摘要:前言 在TCP通信中要使用到几个非常经典的函数( 点这里参考一个关于它们作用的形象比方 ),本文将对这几个函数进行一个简短的使用说明。socket函数 函数作用:创建一个网际字节流套接字 包含头文件:sys/socket.h ( 后面几个函数也一样 ) 函数原型:int socket ( int family, int type, int protocol ) 参数说明: family:指明协议族( 如AF_INET,AF_INET6,AF_LOCAL等 ) type:指明套接字类型( 如SOCK_STREAM,SOCK_DGRAM等 ) protocol:直接指明... 阅读全文

posted @ 2014-02-22 10:57 空山悟 阅读(2096) 评论(0) 推荐(0)

表达格式和数值格式的转换
摘要:前言 在网络编程中,用户给出的IP参数往往是字符串格式的( 我们也称它为表达格式 )。然而,请看通用套接字地址结构定义: 1 struct in_addr { 2 in_addr_t s_addr; // 存放IP地址的整型变量 3 }; 4 5 struct sockaddr_in { 6 uint8_t sin_len; 7 sa_family_t sin_familt; 8 in_port_t sin_port; 9 10 struct in_addr sin_addr; // 存放IP地址的结构11 12 char sin_zero[... 阅读全文

posted @ 2014-02-22 09:21 空山悟 阅读(273) 评论(0) 推荐(0)

主机字节序与网络字节序的转换
摘要:前言 我们知道,数据在主机内的存放有两种模式,也就是说,主机字节序有两种:大端和小端( 这里假定读者已经清楚这个问题 )。但在网络通信中,要求通信数据( 通信数据这里指IP号和端口号 )的使用必须用网络字节序。什么又是网络字节序?网络字节序可以理解为主机字节序的大端模式。如果你的主机字节序原本就是... 阅读全文

posted @ 2014-02-22 09:17 空山悟 阅读(1207) 评论(0) 推荐(0)

一对经典的时间获取客户/服务器程序
摘要:前言 本文通过一对经典的时间获取客户/服务器程序,展现了Linux网络编程的大体框架,为以后更深入的学习打下基础。客户服务器模式网络编程的大体框架客户端代码 1 #include 2 // 下头文件包含socket(), bind()等套接字通信必须的函数。 3 #include 4 // 下... 阅读全文

posted @ 2014-02-22 09:10 空山悟 阅读(347) 评论(0) 推荐(0)

关于TIME_WAIT状态
摘要:前言 为何TCP ”四次分手“ 的过程中会有一个TIME_WAIT状态?这个状态有什么意义呢?这是网络中的一个经典问题,本文将给出精简的回答。什么是TIME_WAIT状态 这是TCP通信协议中出现的一个状态,端点会在这个状态停留2MSL( 最长分节生命期 ),参见下图: 左下方的那个状态即是。... 阅读全文

posted @ 2014-02-22 09:02 空山悟 阅读(582) 评论(0) 推荐(0)

导航