实现HTTP服务器 笔记一IO函数
2014-08-30 00:06
141 查看
实现自己的用于读写网络套接字的IO函数
封装自己的IO函数的想法是在无意间看了《深入理解计算机系统》系统级IO后想到的,回头又翻了下《UNIX网络编程》,发觉还是有这个必要的。1、直接使用系统级IO函数读写网络套接字的问题
在网络编程中使用read和write,必须反复调用他们以处理不足值。在read普通文件时,遇到EOF,会返回最终读了多少个(不足值)。但是如果读的是网络套接字时,有时会因为网络时延和缓冲约束,也会导致read和write返回不足值。所以,要创建一个健壮的服务器,首先应该考虑这个问题,该读的字节得都读了,该写的字节也得都写了。
所以,直接使用的话也是可以的,但是要注意,通过反复调用处理不足值。
stevens在网络编程中也是因为这个问题自己封装了读写函数。(他担心的主要是套接字的缓冲区达到极限后导致的不足值问题)
2、使用C标准库函数读写网络套接字的问题
所谓C标准库函数读写,即fopen fclose fread fwrite fgets fputs scanf printf等程序可以在同一个流上执行输入和输出,输入和输出之间是有限制的
1、对流的限制和对套接字的限制造成冲突
对套接字不能够使用偏移值,而使用流读写要用到lseek等;
对流的读写,读完后要处理偏移,写完后也要处理偏移。
当然也可以直接建立两个流,就不用担心读写对彼此的影响,
2、流有一个缓冲区在堆,这是标准库函数实现的。当我们使用select去判断该套接字是否可读时,就会有问题
select是以read为标准去判断的,而这个只是表明内核缓冲区可读了,并不是说标准缓冲区可读,当然没什么大问题,但是使用gets获取一行时,标准库已经把全部字节读入标准缓冲区,gets再从标准缓冲区读一行就不管了,可是没准里面还有呢。再次select时,它只是看内核缓冲区有没有可读字节,全然不理标准缓冲区的事情了。
3、封装系统级IO函数,直接抄袭stevens
相关文章推荐
- JAVA酱油笔记之Socket实现HTTP服务器
- J2ME学习笔记--实现手机屏幕的切换
- 自己如何实现简单的http服务器
- J2ME学习笔记--实现手机屏幕的切换
- STL学习笔记:用非递归的方法实现汉诺塔问题
- PetShop3.x学习笔记5-我读cocoboy79《MS PetShop 3.x 设计与实现——数据访问层》
- 《面向对象基础:C++实现》学习笔记之一
- 设计模式学习笔记5:Singleton模式及其Delphi实现
- 网络协议恶补心得笔记(一)& Sniffer实现
- ATL学习笔记(3): QueryInterface功能的实现
- 最简单的http服务器实现
- ACE笔记(3)-用 ACE_Reactor 实现SOCKET事件处理
- 关于在FPGA上实现AES算法的笔记
- 新一代Web Service 实现包 -- AXIS2 学习笔记 (二)
- 笔记 C# 实现后台 动态加载 页面标题 Dynamic Load Page Title
- 基于Java实现Http服务器之二
- (大卫的阅读笔记)More Effective C++ Item 附2:一个auto_ptr的实现实例
- SWT下实现Drag and Drop(DND)学习笔记(写作中...)
- PetShop3.x学习笔记5-我读cocoboy79《MS PetShop 3.x 设计与实现——数据访问层》
- 《面向对象基础:C++实现》学习笔记之四