转载请注明链接:http://blog.youkuaiyun.com/c602273091/article/details/53588629
System Level I/O
Unix I/O
Unix下的输入输出设备都可以以文件的方式进行访问。一般访问有write、read、open、close。open就会打开一个文件的描述符,通过描述符进行读和写。close就是关闭描述符表示的文件,如果关闭一个已经关闭的文件这是灾难性的。
读文件:
返回的值在buf里面,如果读错误就会返回-1。实际读回的数目是nbytes。
写文件:
一般来说,不足值可能出现的情况和不可能出现的情况:
文件的行一般以’\n’结束。在mac、linux下是‘\xa’。在windows和网络中就是’\r\n’。
RIO Package
read和write在做读数据的时候会有不足值,那么需要比较健壮的包进行处理不足值。所以RIO包被提出。
RIO包分为有缓存和无缓存。无缓存对网络读写二进制文件特别有效,写proxy lab的时候用的就是它。
无缓存
rio_readn读取n个字节,rio_ write 写n个字节。
rio_readn 的实现如上。
有缓存
rio_readlineb: 从socket连接读取文本行的时候合适用这个有缓存的方法。因为它遇到换行、maxlen、eof都会终止。
rio_readnb: 从socket连接读取文本行的时候合适用这个有缓存的方法。因为它遇到maxlen、eof都会终止。它和rio_readlineb可交替使用。
文件指针的位置:
举个使用例子:
metadata
描述数据的数据。
获取medadata的代码:
使用fork之前:
使用fork之后:
I/O重定向:
standard I/O
标准I/O是定义在系统I/O上的I/O。一般来说标准IO是缓冲型IO,比系统级IO节约cycles,系统级IO涉及系统unix的调用。
标准IO的一些函数:
标准流定义:
用完之后进行清空:
选择I/O
大部分人的职业生涯只需要用到标准输入输出,毕竟这处理终端和磁盘等文件下,标准输入输出可以看做是系统输入输出的一个带缓冲版本,也比较多好用的函数。但是涉及网络编程这类全双工流的时候,RIO包由它的优点。以及涉及信号处理的时候,系统级输入输出是异步安全的。标准输入输出由它的限制:跟在输出函数之后的输入函数,需要在中间插入fflush、fseek、fsetpos、rewind中的某个。跟在输入函数之后的输出函数,也要使用上述的函数中的某个,或者是遇到EOF。
最后是Unix和Linux领域的圣经:
Network Programming
Network Intro
对于网络的认识,大部分集中在客户端-服务器模型。
整个网络的构成。
首先是不同的主机连在一个hub上。
不同的hub通过网桥(桥接以太网)链接。
通过桥接之后,可以形成局域网。
不同的局域网通过路由器,就形成了互联网。
在网络中,不同的主机,甚至是主机上的应用需要进行通信。通信的双方可以是不同的系统,不同的应用之间。为了实现这个需求,网络协议就被提出。
网络协议
网络协议需要完成两个任务:使得每个主机都有唯一的命名;使传送数据比较稳定的方式。比如采用分帧传输。TCP/IP就是著名的网络协议。IP是完成主机间的通信,使用数据报的方式。TCP是完成不同主机间进程级的通信。而目前网络应用中,基于TCP/IP协议构建的套接字,可以实现较稳定的网络服务。
数据在网络中的传输工程:
IPv4是32位IP地址;IPv6是128位IP地址。IP地址是大端格式。
大端格式:http://www.cnblogs.com/graphics/archive/2011/04/22/2010662.html
用nsllokup可以看一些域名的IP地址。
在使用socket编程进行进程间通信的时候,使用主机名(IP地址)+ 端口号进行对接。端口号有些是预留给特定服务的。比如:
PS:它们在linux的/etc/services中可以找到。
Socket接口
通过socket连接两个应用的时候,可以把对方看做是一个文件。
使用socket进行链接的整个过程:
PS:IP地址分类。
目前IP地址不是固定的,有DHCP协议,进行动态IP地址赋值。
socket的客户端的相关函数:
socket的服务器相关函数:
客户端打开client
相关代码:
服务器开始监听
客户端的总的代码
服务器的代码
测网络链接的工具
对于服务器和客户端的socket编程,写一个proxy lab就都有了。而且还有cache和多线程。可以看我以后发的代码。
HTTP
看HTTP1.1协议说明书足矣。当然也可以看HTTP1.0 ——RFC 1945。没有什么难点。接下来看一个简易的服务器。
服务器可以响应动态和静态请求。
首先是静态请求:
然后是动态请求,使用CGI程序。
具体代码如下:
小技巧:读取参数。
最后重头戏:
最后写的proxy-agent已经可以看视频了~
Hint:the image is from CMU 18-600 Course Click Here