关于writev函数

latachong 2009-03-20 10:05:37
用writev函数通过socket送信,不能在拔掉网线后即时的检验到网络错误。
有没有办法能一拔掉网线,writev函数就调用失败呢?

我试了一种方法,在writev调用后,立即刷socket缓冲,然后去判断errno,
可是即使这样也不会产生errno,请大大们帮忙帮忙。

部分代码如下:
FILE* ssp = fdopen(Sd,"r+");
if(ssp == NULL){
Putlog(LL_DEBUG,"fdopen error:%s\n",strerror(errno));
exit(1);
}
errno=0;
writev(Sd, iov, 2);
fflush(ssp);
if(errno != 0) Putlog(LL_DEBUG,"--------write error:%s\n",strerror(errno));

上面代码fdopen后不为空,但会产生一个errno,illegal seek!
writev-〉fflush后不会产生errno。
...全文
830 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
latachong 2009-03-25
  • 打赏
  • 举报
回复
再次感谢fetag。

你解释的那个过程,我能够理解。
可是我疑惑的地方不是这个过程,而是这个过程会导致丢失数据的问题。

因为应用层程序无法在物理链路异常的第一时间内得到错误,而TCP把这些应用程序认为已经成功送信的数据保存到缓冲中,等待重发。可是我觉得这个重发是在一定时间内的重发吧。一定时间内链路不能恢复正常的话,这些数据就丢失了啊。这个我做了测试,大概50秒以上,链路才恢复正常的话,缓冲中的数据就不能真正的送到服务器端了。

TCP这么来做的话,这种潜在的丢数据的设计方式让我百思不得其解。如果它存在这样的缺陷,那么它这么设计的好处又在何处。
它为什么不直接将错误返给应用层程序,这样应用层程序就可以控制数据需不需要重发了。
独孤过儿 2009-03-24
  • 打赏
  • 举报
回复
這個問題是這樣的:

1、網路是分層的,對吧?每一層只負責維護自己這一層功能正常,能和對端的同等層進行正常通信,當自己這一

層功能確保以後,就會給上層indication,說我這一層已經好了,你可以繼續部屬你的工作了,這樣上層又繼續

開始建立上層自己的連接。

2、通常層與層之間通信,是靠原語來實現的,原語主要有四種:

request用於高層或管理層像低層請求提供服務

confirm用於低層向高層或者管理層確認已經完成了所請求的服務

indication用於低層向高層或者管理層提供指示服務有關的信息

response用於高層或管理層向低層證實已經收到了低層報上來的indication

3、從2中的層間通信可以知道。當上層發消息給低層,會用request原語;底層如果緩存空間足夠,鏈路正常,它

就會發confirm給上層,說這個消息我已經發了;上層也會認為,啊,這個消息發出去了。但是一旦底層的底層,

假如物理鏈路有問題了,這個消息實際沒正常發出去,那麼底層就會收到鏈路層報上來的indication,說鏈路有

問題,消息沒能正常發出去,這個消息就不會從緩存中除去,因為稍後還要重發。

4、再說你說的那種緩存滿了的情況,如果上層給底層發消息,也就是request原語,而底層檢測到,自己的緩存

滿了,它就會給上層回comfirm說,我的緩存滿了,暫時不能接受新消息了,這樣上層的發送也就失敗了,通常會

有一個errno,告訴你失敗的原因是什麽。

大概的過程就是這樣的,有什麽問題再消息我,呵呵
latachong 2009-03-24
  • 打赏
  • 举报
回复
万分感谢楼上

可是我现在还是有一个问题.象你所说的,为什么底层链路将
indication返回给协议栈后,它不立即返回给我的应用层
程序,而只是将数据保存缓存中等待网络恢复后重发.

这样有什么好处么?我觉得这样的话,会导致协议栈缓存中
的数据长时间不发而丢失,并且我的应用层程序还不知道数据
已经丢失了.
独孤过儿 2009-03-23
  • 打赏
  • 举报
回复
我觉得如果你是在应用层编程的,底层链路有问题了,会自动的给上层递indication上来的,这样内核协议栈会

检测得到,如果你此时用writev()发送消息,并且内核协议栈也知道了底层有问题,就不会向下发了,会报错给

你。而通常上层应用又都有缓存区,假如你用writev()发了数据,函数也返回了,而此时内核协议栈得到了底层

的indication,它就有可能将数据保存在缓冲区中,等到物理链路恢复以后,重发这个消息,但是这个过程中,

应该不会给你的上层应用程序返回一个错误,这个不考虑你的消息有ack认证的情况哦。

所以我觉得,你不用管链路的状态,只要writev()不返回错误值,你就尽管发,对端收不到消息,那就是内核协议

栈的错,这个不应该你来买单!
latachong 2009-03-23
  • 打赏
  • 举报
回复
谢谢楼上分析
那我应该怎么在链路有问题的第一时间,
立即得到底层给的这个indication。
而不会去writev送信
独孤过儿 2009-03-23
  • 打赏
  • 举报
回复
writev()函数是把写入的数据当成一个不可分割的块来写入的,而不是说它不会失败!

检测链路状态的活动不能由writev()来保证。根据协议分层的理论,当底层链路有问题的时候,应该是底层给上

层报一个indication上来,然后上层感知到底层链路不可达了,而不是上层去检测。

每层都只保证自己这层的功能正常,同时对上层和对下层提供良好的接口,这是协议分层的核心思想。
latachong 2009-03-23
  • 打赏
  • 举报
回复
顶一下
Bestrem_9 2009-03-23
  • 打赏
  • 举报
回复
啊,这个还是蛮有意思的,关注下啊
  • 打赏
  • 举报
回复
汗,你拔掉网线后,write不失败又会怎样?
latachong 2009-03-20
  • 打赏
  • 举报
回复
楼上大大,是writev函数,不是write函数
它的确不失败,还是能成功返回写入的字节数
第1章 UNIX基础知识  1.1 引言  1.2 UNIX体系结构  1.3 登录  1.4 文件和目录  1.5 输入和输出  1.6 程序和进程  1.7 出错处理  1.8 用户标识  1.9 信号  1.10 时间值  1.11 系统调用和库函数  1.12 小结  习题  第2章 UNIX标准化及实现  2.1 引言  2.2 UNIX标准化  2.2.1 ISO C  2.2.2 IEEE POSIX  2.2.3 Single UNIX Specification  2.2.4 FIPS  2.3 UNIX系统实现  2.3.1 SVR4  2.3.2 4.4BSD  2.3.3 FreeBSD  2.3.4 Linux  2.3.5 Mac OS X  2.3.6 Solaris  2.3.7 其他UNIX系统  2.4 标准和实现的关系  2.5 限制  2.5.1 ISO C限制  2.5.2 POSIX限制  2.5.3 XSI限制  2.5.4 sysconf、pathconf和fpathconf函数  2.5.5 不确定的运行时限制  2.6 选项  2.7 功能测试宏  2.8 基本系统数据类型  2.9 标准之间的冲突  2.10 小结  习题  第3章 文件I/O  3.1 引言  3.2 文件描述符  3.3 open函数  3.4 creat函数  3.5 close函数  3.6 lseek函数  3.7 read函数  3.8 write函数  3.9 I/O的效率  3.10 文件共享  3.11 原子操作  3.12 dup和dup2函数  3.13 sync、fsync和fdatasync函数  3.14 fcntl函数  3.15 ioctl函数  3.16 /dev/fd  3.17 小结  习题  第4章 文件和目录  4.1 引言  4.2 stat、fstat和lstat函数  4.3 文件类型  4.4 设置用户ID和设置组ID  4.5 文件访问权限  4.6 新文件和目录的所有权  4.7 access函数  4.8 umask函数  4.9 chmod和fchmod函数  4.10 粘住位  4.11 chown、fchown和lchown函数  4.12 文件长度  4.13 文件截短  4.14 文件系统  4.15 link、unlink、remove和rename函数  4.16 符号链接  4.17 symlink和readlink函数  4.18 文件的时间  4.19 utime函数  4.20 mkdir和rmdir函数  4.21 读目录  4.22 chdir、fchdir和getcwd函数  4.23 设备特殊文件  4.24 文件访问权限位小结  4.25 小结  习题  第5章 标准I/O库  5.1 引言  5.2 流和FILE对象  5.3 标准输入、标准输出和标准出错  5.4 缓冲  5.5 打开流  5.6 读和写流  5.7 每次一行I/O  5.8 标准I/O的效率  5.9 二进制I/O  5.10 定位流  5.11 格式化I/O  5.12 实现细节  5.13 临时文件  5.14 标准I/O的替代软件  5.15 小结  习题  第6章 系统数据文件和信息  6.1 引言  6.2 口令文件  6.3 阴影口令  6.4 组文件  6.5 附加组ID  6.6 实现的区别  6.7 其他数据文件  6.8 登录账户记录  6.9 系统标识  6.10 时间和日期例程  6.11 小结  习题  第7章 进程环境  7.1 引言  7.2 main函数  7.3 进程终止  7.4 命令行参数  7.5 环境表  7.6 C程序的存储空间布局  7.7 共享库  7.8 存储器分配  7.9 环境变量  7.10 setjmp和longjmp函数  7.11 getrlimit和setrlimit函数  7.12 小结  习题  第8章 进程控制  8.1 引言  8.2 进程标识符  8.3 fork函数  8.4 vfork函数  8.5 exit函数  8.6 wait和waitpid函数  8.7 waitid函数  8.8 wait3和wait4函数  8.9 竞争条件  8.10 exec函数  8.11 更改用户ID和组ID  8.12 解释器文件  8.13 system函数  8.14 进程会计  8.15 用户标识  8.16 进程时间  8.17 小结  习题  第9章 进程关系  9.1 引言  9.2 终端登录  9.3 网络登录  9.4 进程组  9.5 会话  9.6 控制终端  9.7 tcgetpgrp、tcsetpgrp和tcgetsid函数  9.8 作业控制  9.9 shell执行程序  9.10 孤儿进程组  9.11 FreeBSD实现  9.12 小结  习题  第10章 信号  10.1 引言  10.2 信号概念  10.3 signal函数  10.4 不可靠的信号  10.5 中断的系统调用  10.6 可重入函数  10.7 SIGCLD语义  10.8 可靠信号术语和语义  10.9 kill和raise函数  10.10 alarm和pause函数  10.11 信号集  10.12 sigprocmask函数  10.13 sigpending函数  10.14 sigaction函数  10.15 sigsetjmp和siglongjmp函数  10.16 sigsuspend函数  10.17 abort函数  10.18 system函数  10.19 sleep函数  10.20 作业控制信号  10.21 其他特征  10.22 小结  习题  第11章 线程  11.1 引言  11.2 线程概念  11.3 线程标识  11.4 线程的创建  11.5 线程终止  11.6 线程同步  11.7 小结  习题  第12章 线程控制  12.1 引言  12.2 线程限制  12.3 线程属性  12.4 同步属性  12.5 重入  12.6 线程私有数据  12.7 取消选项  12.8 线程和信号  12.9 线程和fork  12.10 线程和I/O  12.11 小结  习题  第13章 守护进程  13.1 引言  13.2 守护进程的特征  13.3 编程规则  13.4 出错记录  13.5 单实例守护进程  13.6 守护进程的惯例  13.7 客户进程-服务器进程模型  13.8 小结  习题  第14章 高级I/O  14.1 引言  14.2 非阻塞I/O  14.3 记录锁  14.4 STREAMS  14.5 I/O多路转接  14.5.1 select和pselect函数  14.5.2 poll函数  14.6 异步I/O  14.6.1 系统V异步I/O  14.6.2 BSD异步I/O  14.7 readv和writev函数  14.8 readn和writen函数  14.9 存储映射I/O  14.10 小结  习题  第15章 进程间通信  15.1 引言  15.2 管道  15.3 popen和pclose函数  15.4 协同进程  15.5 FIFO  15.6 XSI IPC  15.6.1 标识符和键  15.6.2 权限结构  15.6.3 结构限制  15.6.4 优点和缺点  15.7 消息队列  15.8 信号量  15.9 共享存储  15.10 客户进程-服务器进程属性  15.11 小结  习题  第16章 网络IPC:套接字  16.1 引言  16.2 套接字描述符  16.3 寻址  16.3.1 字节序  16.3.2 地址格式  16.3.3 地址查询  16.3.4 将套接字与地址绑定  16.4 建立连接  16.5 数据传输  16.6 套接字选项  16.7 带外数据  16.8 非阻塞和异步I/O  16.9 小结  习题  第17章 高级进程间通信  17.1 引言  17.2 基于STREAMS的管道  17.2.1 命名的STREAMS管道  17.2.2 唯一连接  17.3 UNIX域套接字  17.3.1 命名UNIX域套接字  17.3.2 唯一连接  17.4 传送文件描述符  17.4.1 经由基于STREAMS的管道传送文件描述符  17.4.2 经由UNIX域套接字传送文件描述符  17.5 open服务器版本1  17.6 open服务器版本2  17.7 小结  习题  第18章 终端I/O  18.1 引言  18.2 综述  18.3 特殊输入字符  18.4 获得和设置终端属性  18.5 终端选项标志  18.6 stty命令  18.7 波特率函数  18.8 行控制函数  18.9 终端标识  18.10 规范模式  18.11 非规范模式  18.12 终端的窗口大小  18.13 termcap,terminfo和curses  18.14 小结  习题  第19章 伪终端  19.1 引言  19.2 概述  19.3 打开伪终端设备  19.3.1 基于STREAMS的伪终端  19.3.2 基于BSD的伪终端  19.3.3 基于Linux的伪终端  19.4 pty_fork函数  19.5 pty程序  19.6 使用pty程序  19.7 高级特性  19.8 小结  习题  第20章 数据库函数库  20.1 引言  20.2 历史  20.3 函数库  20.4 实现概述  20.5 集中式或非集中式  20.6 并发  20.7 构造函数库  20.8 源代码  20.9 性能  20.10 小结  习题  第21章 与网络打印机通信  21.1 引言  21.2 网络打印协议  21.3 超文本传输协议  21.4 打印假脱机技术  21.5 源代码  21.6 小结  习题  附录A 函数原型  附录B 其他源代码  附录C 部分习题答案  参考书目
目 录 译者序 译者简介 前言 第1章 UNIX基础知识 1 1.1 引言 1 1.2 登录 1 1.3 文件和目录 2 1.4 输入和输出 5 1.5 程序和进程 7 1.6 ANSI C 9 1.7 出错处理 10 1.8 用户标识 11 1.9 信号 12 1.10 UNIX时间值 14 1.11 系统调用和库函数 14 1.12 小结 16 习题 16 第2章 UNIX标准化及实现 17 2.1 引言 17 2.2 UNIX标准化 17 2.3 UNIX实现 19 2.4 标准和实现的关系 21 2.5 限制 21 2.6 功能测试宏 32 2.7 基本系统数据类型 32 2.8 标准之间的冲突 33 2.9 小结 34 习题 34 第3章 文件I/O 35 3.1 引言 35 3.2 文件描述符 35 3.3 open函数 35 3.4 creat函数 37 3.5 close函数 37 3.6 lseek函数 38 3.7 read函数 40 3.8 write函数 41 3.9 I/O的效率 41 3.10 文件共享 42 3.11 原子操作 45 3.12 dup和dup2函数 46 3.13 fcntl函数 47 3.14 ioctl函数 50 3.15 /dev/fd 51 3.16 小结 52 习题 52 第4章 文件和目录 54 4.1 引言 54 4.2 stat, fstat和lstat函数 54 4.3 文件类型 55 4.4 设置-用户-ID和设置-组-ID 57 4.5 文件存取许可权 58 4.6 新文件和目录的所有权 60 4.7 access函数 60 4.8 umask函数 62 4.9 chmod和fchmod函数 63 4.10 粘住位 65 4.11 chown, fchown和 lchown函数 66 4.12 文件长度 67 4.13 文件截短 68 4.14 文件系统 69 4.15 link, unlink, remove和rename 函数 71 4.16 符号连接 73 4.17 symlink 和readlink函数 76 4.18 文件的时间 76 4.19 utime函数 78 4.20 mkdir和rmdir函数 79 4.21 读目录 80 4.22 chdir, fchdir和getcwd函数 84 4.23 特殊设备文件 86 4.24 sync和fsync函数 87 4.25 文件存取许可权位小结 88 4.26 小结 89 习题 89 第5章 标准I/O库 91 5.1 引言 91 5.2 流和FILE对象 91 5.3 标准输入、标准输出和标准出错 91 5.4 缓存 91 5.5 打开流 94 5.6 读和写流 96 5.7 每次一行I/O 98 5.8 标准I/O的效率 99 5.9 二进制I/O 100 5.10 定位流 102 5.11 格式化I/O 103 5.12 实现细节 104 5.13 临时文件 105 5.14 标准I/O的替代软件 108 5.15 小结 108 习题 108 第6章 系统数据文件和信息 110 6.1 引言 110 6.2 口令文件 110 6.3 阴影口令 112 6.4 组文件 113 6.5 添加组ID 114 6.6 其他数据文件 115 6.7 登录会计 116 6.8 系统标识 116 6.9 时间和日期例程 117 6.10 小结 121 习题 121 第7章 UNIX进程的环境 122 7.1 引言 122 7.2 main 函数 122 7.3 进程终止 122 7.4 命令行参数 125 7.5 环境表 126 7.6 C程序的存储空间布局 126 7.7 共享库 127 7.8 存储器分配 128 7.9 环境变量 130 7.10 setjmp 和longjmp函数 132 7.11 getrlimit 和setrlimit函数 136 7.12 小结 139 习题 140 第8章 进程控制 141 8.1 引言 141 8.2 进程标识 141 8.3 fork函数 142 8.4 vfork 函数 145 8.5
第1章 UNIX基础知识 1.1 引言 1.2 登录 1.2.1 登录名 1.2.2 shell 1.3 文件和目录 1.3.1文件系统 1.3.2 文件名 1.3.3路径名 1.3.4工作目录 1.3.5起始目录 1.4输入和输出 1.4.1文件描述符 1.4.2标准输入、标准输出和标准出错 1.4.3不用缓存的I/O 1.4.4标准I/O 1.5程序和进程 1.5.1程序 1.5.2进程和进程ID 1.5.3进程控制 1.6 ANSI C 1.6.1 函数原型 1.6.2类属指针 1.6.3原始系统数据类型 1.7 出错处理 1.8 用户标识 1.8.1 用户ID 1.8.2 组ID 1.8.3 添加组ID 1.9 信号 1.10 UNIX时间值 1.11 系统调用和库函数 1.12 小结 习题 第2章 UNIX标准化及实现 2.1 引言 2.2 UNIX标准化 2.2.1 ANSI C 2.2.2 IEEE POSIX 2.2.3 X/Open XPG3 2.2.4 FIPS 2.3 UNIX实现 2.3.1 SVR4 2.3.2 4.3+BSD 2.4 标准和实现的关系 2.5 限制 2.5.1 ANSI C限制 2.5.2 POSIX限制 2.5.3 XPG3限制 2.5.4 sysconf、pathconf和 fpathconf函数 2.5.5 FIPS 151-1要求 2.5.6 限制总结 2.5.7 未确定的运行时间限制 2.6 功能测试宏 2.7 基本系统数据类型 2.8 标准之间的冲突 2.9 小结 习题 第3章 文件I/O 3.1 引言 3.2 文件描述符 3.3 open函数 3.4 creat函数 3.5 close函数 3.6 lseek函数 3.7 read函数 3.8 write函数 3.9 I/O的效率 3.10 文件共享 3.11 原子操作 3.11.1 添加至一个文件 3.11.2 创建一个文件 3.12 dup和dup2函数 3.13 fcntl函数 3.14 ioctl函数 3.15 /dev/fd 3.16 小结 习题 第4章 文件和目录 4.1 引言 4.2 stat,fstat和lstat函数 4.3 文件类型 4.4 设置-用户-ID和设置-组-ID 4.5 文件存取许可权 4.6 新文件和目录的所有权 4.7 access函数 4.8 umask函数 4.9 chmod 和fchomod函数 4.10 粘住位 4.11 chown, fchown和 lchown函数 4.12 文件长度 4.13 文件截短 4.14 文件系统 4.15 link, unlink, remove和 rename 函数 4.16 符号连接 4.17 symlink 和readlink函数 4.18 文件的时间 4.19 utime函数 4.20 mkdir和 rmdir函数 4.21 读目录 4.22 chdir, fchdir和 getcwd函数 4.23 特殊设备文件 4.24 sync和 fsync函数 4.25 文件存取许可权位小结 4.26 小结 习题 第5章 标准I/O库 5.1 引言 5.2 流和FILE对象 5.3 标准输入、标准输出和标准出错 5.4 缓存 5.5 打开流 5.6 读和写流 5.7 每次一行I/O 5.8 标准I/O的效率 5.9 二进制I/O 5.10 定位流 5.11 格式化I/O 5.12 实现细节 5.13 临时文件 5.14 标准I/O的替代软件 5.15 小结 习题 第6章 系统数据文件和信息 6.1 引言 6.2 口令文件 6.3 阴影口令 6.4 组文件 6.5 添加组ID 6.6 其他数据文件 6.7 登录会计 6.8 系统标识 6.9 时间和日期例程 6.10 小结 习题 第7章 UNIX进程的环境 7.1 引言 7.2 main 函数 7.3 进程终止 7.3.1 exit和_exit函数 7.3.2 atexit函数 7.4 命令行参数 7.5 环境表 7.6 C程序的存储空间布局 7.7 共享库 7.8 存储器分配 7.9 环境变量 7.10 setjmp 和longjmp函数 7.10.1 自动, 寄存器和易失变量 7.10.2 自动变量的潜在问题 7.11 getrlimit 和setrlimit函数 7.12 小结 习题 第8章 进程控制 8.1 引言 8.2 进程标识 8.3 fork函数 8.4 vfork 函数 8.5 exit函数 8.6 wait和waitpid函数 8.7 wait3和 wait4函数 8.8 竞态条件 8.9 exec函数 8.10 更改用户ID 和组ID 8.10.1 setreuid 和setregid函数 8.10.2 seteuid和 setegid函数 8.10.3 组ID 8.11 解释器文件 8.12 system函数 8.13 进程会计 8.14 用户标识 8.15 进程时间 8.16 小结 习题 第9章 进程关系 9.1 引言 9.2 终端登录 9.2.1 4.3+BSD终端登录 9.2.2 SVR4终端登录 9.3 网络登录 9.3.1 4.3+BSD网络登录 9.3.2 SVR4网络登录 9.4 进程组 9.5 对话期 9.6 终端控制 9.7 tcgetpgrp 和tcsetpgrp函数 9.8 作业控制 9.9 shell执行程序 9.10 孤儿进程组 9.11 4.3+BSD实现 9.12 小结 习题 第10章 信号 10.1 引言 10.2 信号的概念 10.3 signal函数 10.3.1 程序起动 10.3.2 进程创建 10.4 不可靠的信号 10.5 中断的系统调用 10.6 可再入函数 10.7 SIGCLD语义 10.8 可靠信号术语和语义 10.9 kill 和raise函数 10.10 alarm和 pause函数 10.11 信号集 10.12 sigprocmask 函数 10.13 sigpending函数 10.14 sigaction函数 10.15 sigsetjmp 和siglongjmp函数 10.16 sigsuspend函数 10.17 abort函数 10.18 system 函数 10.19 sleep函数 10.20 作业控制信号 10.21 其他特征 10.21.1 信号名字 10.21.2 SVR4信号处理程序的附加参数 10.21.3 4.3+BSD信号处理程序的附加参数 10.22 小结 习题 第11章 终端I/O 11.1 引言 11.2 综述 11.3 特殊输入字符 11.4 获得和设置终端属性 11.5 终端选择标志 11.6 stty命令 11.7 波特率函数 11.8 行控制函数 11.9 终端标识 11.10 规范方式 11.11 非规范方式 11.12 终端的窗口大小 11.13 termcap, terminfo和 curses 11.14 小结 习题 第12章 高级I/O 12.1 引言 12.2 非阻塞I/O 12.3 记录锁 12.3.1 历史 12.3.2 fcntl记录锁 12.3.3 锁的隐含继承和释放 12.3.4 4.3+BSD的实现 12.3.5 建议性锁和强制性锁 12.4 流 12.4.1 流消息 12.4.2 putmsg和 putpmsg函数 12.4.3 流ioct1操作 12.4.4 write至流设备 12.4.5 写方式 12.4.6 getmsg和 getpmsg函数 12.4.7 读方式 12.5 I/O多路转接 12.5.1 select函数 12.5.2 poll函数 12.6 异步I/O 12.6.1 SVR4 12.6.2 4.3+BSD 12.7 readv和writev函数 12.8 readn和 writen函数 12.9 存储映射I/O 12.10 小结 习题 第13章 精灵进程 13.1 引言 13.2 精灵进程的特征 13.3 编程规则 13.4 出错记录 13.4.1 SVR4流log驱动程序 13.4.2 4.3+BSD syslog设施 13.5 客户机-服务器模型 13.6 小结 习题 第14章 进程间通信 14.1 引言 14.2 管道 14.3 popen和 pclose函数 14.4 协同进程 14.5 FIFO 14.6 系统V IPC 14.6.1 标识符和关键字 14.6.2 许可权结构 14.6.3 结构限制 14.6.4 优点和缺点 14.7 消息队列 14.8 信号量 14.9 共享存储 14.10 客户机-服务器属性 14.11 小结 习题 第15章 高级进程间通信 15.1 引言 15.2 流管道 15.3 传送文件描述符 15.3.1 SVR4 15.3.2 4.3BSD 15.3.3 4.3+BSD 15.4 open服务器第1版 15.5 客户机-服务器连接函数 15.5.1 SVR4 15.5.2 4.3+BSD 15.6 open服务器第2版 15.7 小结 习题 第16章 数据库函数库 16.1 引言 16.2 历史 16.3 函数库 16.4 实现概述 16.5 集中式或非集中式 16.6 并发 16.6.1 粗锁 16.6.2 细锁 16.7 源码 16.8 性能 16.8.1 单进程的结果 16.8.2 多进程的结果 16.9 小结 习题 第17章 与PostScript打印机通信 17.1 引言 17.2 PostScript通信机制 17.3 假脱机打印 17.4 源码 17.5 小结 习题 第18章 调制解调器拨号器 18.1 引言 18.2 历史 18.3 程序设计 18.4 数据文件 18.5 服务器设计 18.6 服务器源码 18.7 客户机设计 18.7.1 终端行规程 18.7.2 一个进程还是两个进程 18.8 客户机源码 18.9 小结 习题 第19章 伪终端 19.1 引言 19.2 概述 19.2.1 网络登录服务器 19.2.2 script程序 19.2.3 expect程序 19.2.4 运行协同程序 19.2.5 观看长时间运行程序的输出 19.3 打开伪终端设备 19.3.1 SVR4 19.3.2 4.3+BSD 19.4 pty_fork函数 19.5 pty程序 19.6 使用pty程序 19.6.1 utmp文件 19.6.2 作业控制交互 19.6.3 检查长时间运行程序的输出 19.6.4 script程序 19.6.5 运行协同进程 19.6.6 用交互模式驱动交互式程序 19.7 其他特性 19.7.1 打包模式 19.7.2 远程模式 19.7.3 窗口大小变化 19.7.4 信号发生 19.8 小结 习题 附录A 函数原型 附录B 其他源代码 附录C 习题答案 参考书目
本书通过55个精彩的实例,全面剖析了在Linux下编写网络应用程序的方法,并阐述了网络协议架构和开发规范。为了适应不同读者的需要,本书从最基本的Linux系统操作到网络技术的基本理念,逐步深入至Linux/UNIX下具体的编程实践,结合大量具体实例和编程经验,为读者展现Linux平台下网络编程的魅力。 全书由13章组成,内容涉及到Lindx系统编程基础、TCP/UDP协议、套接字编程概念及I/O模型、高级编程中需要用到的进程问通信同步、多路复用、多线程编程和一些高级套接字控制方法、IPv6介绍以及网络安全等。本书最后还汇集了很多网络编程的具体实例,读者可以模仿书中的范例来开发自己的应用程序。 本书内容丰富结构清晰,实例典型,文字简洁流畅,边讲边练。不但是Linux应用与开发的从业人员的指导书,而且也可作为大专院校相关专业师生教学与自学的参考书以及社会初、中级培训班教材。 基础篇 第1章 linux平台环境简单回顾 1.1 文件系统及其操作 1.1.1 文件系统结构 1.1.2 文件i/o操作 1.1.3 文件、目录及操作 1.2 标推输入输出 1.2.1 流和buffer 1.2.2 i/o类型 1.3 进程概念及控制 1.3.1 进程的运行和终止 1.3.2 进程间竞争 1.3.3 wait操作 1.4 信号 1.4.1 信号屏蔽字 1.4.2 相关操作 1.5 本章小结 第2章 进程间通信 2.1 管道和fif0 2.1.1 管道的创建和使用 .2.1.2 实例 2.1.3 popen和pclose函数 2.1.4 fifo的创建和使用 2.1.5 用fif0实现多客户服务 2.1.6 系统对管道和fif0的限制 2.2 消息队列 2.2.1 消息队列的数据结构 2.2.2 消息队列的创建 2.2.3 消息队列的操作 2.2.4 实例 2.2.5 消息队列的限制 2.3 信号量 2.3.1 信号量的数据结构 2.3.2 信号量的创建和操作 2.4 共享内存区 2.4.1 共享内存区的数据结构 2.4.2 共享内存区的创建和操作 2.4.3 实例 2.4.4 共享内存区的限制 2.5 本章小结 第3章 传输层协议tcp和udp 3.1 tcp/ip基本框架 3.1.1 网络协议与层次 3.1.2 数据的封装与分用 3.1.3 客户-服务器模型 3.2 用户数据报协议(udp) 3.2.1 udp首部 3.3 传输控制协议(tcp) 3.3.1 顺序传输 3.3.2 保证数据的可靠性与完整性 3.3.3 双向传输 3.3.4 tcp首部 3.4 tcp连接的建立、握手与结束 3.4.1 连接的建立--三方握手 3.4.2 tcp参数 3.4.3 tcp连接的终止 3.5 端口 3.5.1 端口号的分配 3.5.2 套接字对 3.6 缓冲区 3.7 标准internet服务 3.8 本章小结 第4章 tcp套接字简介 4.1 套接字概述 4.2 套接字地址结构 4.3 位顺序调整 4.3.1 字节处理函数 4.3.2 地址转换函数 4.4 建立套接字 4.5 连接 4.5.1 客户端 4.5.2 服务器端 4.6 服务进程创建 4.6.1 函数介绍 4.6.2 范例 4.7 终止连接 4.8 连接地址信息获取 4.9 socket编程client/server应用简单示例 4.9.1 一个简单www浏览器 4.9.2 inetd编程 4.9.3 获取本地ip 4.9.4 dns的使用 4.9.5 从socket中读出一行语句 4.9.6 处理用户登录及权限设置 4.10 本章小结 第5章 tcp套接字编程实例 5.1 tcp客户--服务器实例一 5.1.1 服务器端代码-vcserver.c 5.1.2 客户端代码-vcclient.c 5.1.3 运行结果 5.2 实例之二 5.2.1 服务器端代码-tcpserver.c 5.2.2 客户端代码-tcpclient.c 5.3 本章小结 第6章 udp数据报 6.1 udp通讯机制 6.1.1 基本通讯过程 6.1.2 udp与tcp的比较 6.1.3 连接的udp 6.1.4 udp应用实例 6.2 udp的应用场合 6.3 增加udp的可靠性 6.4 udp编程综合实例 6.5 本章小结 第7章 套接字中的i/o模型 7.1 阻塞式i/o 7.1.1 读阻塞 7.1.2 写阻塞 7.1.3 会接宁建立中的阻塞 7.1.4 实例一 7.1.5 实例二 7.2 非阻塞式i/o 7.2.1 读操作 7.2.2 写操作 7.2.3 建立连接过程 7.2.4 接收连接过程 7.2.5 非阻塞方式的实现 7.3 实例 7.3.1 taik实例 7.3.2 可处理并发服务的echo实例 第8章 套接字属性控制 8.1 获取和设置套接字属性 8.1.1 getsockopt函数和 setsockopt函数 8.1.2 通用套接字属性 8.2 ipv4和ipv6套接字属性 8.3 套接字属性控制 8.3.1 ioctl函数 8.3.2 fcntl函数 8.4 本章小结 提 高 篇 第9章 进程间通讯的同步 9.1 互斥锁 9.1.1 互斥锁的基本原理 9.1.2 互斥锁的基本操作函数 9.1.3 编程实例 9.2 条件变量 9.2.1 条件变量的基本过程 9.2.2 条件变量的操作函数 9.2.3 编程实例 9.3 读写锁 9.3.1 基本原理 9.3.2 读写锁的操作函数 9.4 记录上锁 9.4.1 记录上锁的基本原理 9.4.2 fcntl记录上锁 9.4.3 记录上锁应用举例 9.5 本章小结 第10章 多路复用和信号驱动i/0 10.1 多路复用 10.1.1 多路复用的基本原理 10.1.2 select函数 10.1.3 select应用实例 10.2 poll函数 10.3 多路复用编程实例 10.4 信号驱动i/0 10.5 本章小结 第11章 高级套接字i/0操作 11.1 send和recv函数 11.1.1 send函数 11.1.2 recv函数 11.2 readv和writev函数 11.2.1 readv函数 11.2.2 writev函数 11.3 sendto和recvfrom函数 11.3.1 sendto函数 11.3.2 recvfrom()函数 11.3.3 一个运用sendto()和recvfrom()函数的实例 11.4 recvmsg和sendmsg函数 11.5 辅助数据 11.6 本章小结 第12章 多线程编程及网络应用 12.1 基本概念 12.1.1 引入多线程的原因 12.1.2 线程的基本概念 12.1.3 线程的分类 12.2 线程基础 12.2.1 线程的基本操作函数 12.2.2 简单的多线程编程 12.2.3 修改线程的属性 12.3 线程应用中的同步问题 12.3.1 特定线程数据 12.3.2 互斥锁 12.3.3 条件变量 12.3.4 信号量 12.4 多线程编程的网络应用 12.4.1 函数的多线程安全性 12.4.2 多线程的实际应用 12.5 本章小结 第13章 ip协议及其属性 13.1 ipv4内容 13.1.1 ipv4数据报的格式 13.1.2 ipv4地址 13.1.3 ipv4选项 13.1.4 internet控制报文协议icmp 13.1.5 internet路由选择协议 13.1.6 ipv4的局限性及其缺点 13.2 ipv6内容 13.2.1 ipv6基本头部的格式 13.2.2 ipv4到ipv6的变化 13.2.3 ipv6地址 13.2.4 ipv6的扩展头部 13.2.5 ipv6路由选择 第14章 网络编程的安全性问题 14.1 系统子程序 14.1.1 i/0子程序 14.1.2 进程控制 14.1.3 文件属性 14.1.4 uid和gid的处理 14.2 标准c库 14.2.1 标准i/o 14.2.2 /etc/passwd处理 14.2.3 /etc/group的处理 14.2.4 加密子程序 14.2.5 运行shell 14.3 写安全的c程序 14.4 root程序的设计 14.5 本章小结 实例篇 实例一 ping 实例二 聊天室的实现 实例三 端口扫描程序 实例四 网页更新检查程序 实例五 sniffer的基本实现 实例六 ip包检查程序 实例七 ip欺骗实例 实例八 路由测试程序 实例九 linux防火墙的编写 实例十 守护进程 实例十一 普通文件传输协议(tftp) 附录 附录一 gcc命令选项 1.使用语法 2.选项 附录二 makefile文件的编写方法 1.makefile文件的基本结构 2.makefile文件编写规则 3.makefile变量 4.假象目的 5.函数 6.实用makefile举例 7.一个的功能齐全的makefile 附录三 gdb调试器 1.gdb的基本使用方法 2.gdb命令 3.在gdb下运行程序

23,118

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧