System Level I/O && Network Programming

本文深入探讨Unix下的I/O操作及网络编程基础,包括系统级I/O、标准I/O、RIO包等内容,并详细解析网络协议、Socket接口以及HTTP协议的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载请注明链接: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值