现在的位置: 首页 > 综合 > 正文

实现HTTP服务器 笔记一IO函数

2017年12月05日 ⁄ 综合 ⁄ 共 806字 ⁄ 字号 评论关闭

实现自己的用于读写网络套接字的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

抱歉!评论已关闭.