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