fdopen and socket
来源:互联网 发布:js 实现高斯模糊效果 编辑:程序博客网 时间:2024/05/17 22:50
很多互联网上的协议例如HTTP、SIP、SMTP、FTP的控制连接协议都是基于文本行的。所谓基于文本行,指的是信息以文本传递,一个信息单元传递完毕后要传送换行。比如对于HTTP的GET请求来说,GET /index.html HTTP/1.0
是一行,接下去每个头部信息各占一行。一个空行表示整个请求结束。而tcp是基于流的,使用read/recv和write/send一次读入或写入的字节可能比要求的少,并且信息单元也不是按换行分割的。事实上流是不可分割的。对方调用send一次传送200K,也许接收方第一次调用recv只能收到 50K,后续还要调用多次recv才能收完。并且如果需要在TCP上应用HTTP这样的协议,需要自己检测换行。将数据接收下来以后,换行可能在任何地方出现而不只是在数据的末尾出现。
如果不苛求十全十美,有一个简单方法可以解决这个问题,那就是将socket与c标准库里的标准输入输出连接起来。
具体的说,就是使用下面这个调用。
FILE *fdopen(int fildes, const char *mode);
假设sockfd是用socket()建立的一个socket描述符。调用
fpin=fdopen(sockfd,"r");
fpout=fdopen(dup(sockfd),"w");
可以建立两个FILE指针fpin和fpout。
调用
setlinebuf(fpin);
setlinebuf(fpout);
可以将缓冲模式设置成行缓冲。
现在在这两个FILE指针上就可以调用fgets、fputs等函数了。在遇到换行符号时,fputs会将缓冲区内的数据实际发送到网络上,而对于 fgets,会一直累计接收数据并放在缓冲区中,直到遇到换行才返回。当然,需要给fgets指定一个行长度的上限,以免缓冲区溢出。与gets、 puts不同,fgets、fputs会保留换行符。另外,调用fflush可以强制将缓冲区的数据写到网络上。
在这样的基础上去实现基于行的文本协议就非常方便了。
全是标准库的基础知识,没什么新鲜的,但是用标准库的I/O函数处理socket,还是很方便的。我也是最近想写一个http+https的代理服务器程序,才发现有这么一个思路可以用。网上没有特别权威的资料,在比较权威(个人认为)《UNIX网络编程》里只是用了一个小节介绍,并不详细。在应用层,基于文本的协议是一种风格和趋势,HTTP、SMTP、SIP、SOAP等等全都是文本协议,文本协议天生就有很多优点,所以使用标准I/O库来处理就可以大大的方便网络程序的编写和新文本协议的设计
- fdopen and socket
- fdopen and socket
- fdopen and socket
- fdopen and socket
- fdopen和socket
- fdopen一个 socket 的问题
- fopen、freopen、fdopen and fclose
- fdopen
- fdopen()
- fdopen
- fdopen()
- fdopen与socket---文件描述符与文件指针间的转换
- open,fopen,fdopen
- fdopen的用法
- fdopen和popen
- fdopen()和fileno()函数
- fread、fwrite、fdopen
- fopen/freopen/fdopen
- CuteReminder --清华大学 微软中国计算机科学实验班
- StringEscapeUtils.escapeJavaScript(String abc)
- 【连载】优秀程序员的45个习惯之42——允许大家自己想办法
- 用AspNetPager控件最详细的分页实现方法
- Add USB WIFI to your system
- fdopen and socket
- 我对异常的理解_temp1
- 《C专家编程》之C语言的声明
- 105 - The Skyline Problem
- SQL*PLUS命令的使用大全(上)
- netbeans快捷键设置
- DevExpress控件的使用
- 存储过程中的 set ansi_nulls
- VC项目文件说明