📄 linux网络编程--4. 完整的读写函数.html
字号:
<html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><meta name="GENERATOR" content="Microsoft FrontPage 3.0"><title>[ 永远的UNIX > Linux网络编程--4. 完整的读写函数 ]</title><style type="text/css"><!--body,th,input,select,textarea,select,checkbox{font:12pt 宋体}A:link { text-decoration:underline; color:#E6A306}A:visited { text-decoration:underline; color:#E6A306}A:hover { text-decoration:underline; color:#FFFF00}body { font-family: "宋体", "serif"; font-size: 12pt}td { font-family: "宋体", "serif"; font-size: 12pt}p { font-size: 9pt; line-height: 150%}--></style></head><body text="#ffffff" background="/images/bline.gif"><div align="center"><center><table border="0" width="70%" cellspacing="0" cellpadding="0" height="400"><tr> <td height="45"><p align="center"><img src="/images/title.gif" alt="[ 永远的UNIX::一个UNIX系统管理员的网上家园 ]"></td> </tr> <tr><tr> <td align=left height="40" valign=bottom align=left><small><a href="http://www.fanqiang.com">首页</a> > <a href=/a4/index.shtml>编程技术</a> > <a href=/a4/b7/index.html>网络编程</a> > 正文</small></td></tr><tr> <td width="100%" height="2" colspan="5" bgcolor="#D09F0D"><img src="/images/c.gif" width=1 height=1></td> </tr><tr> <td align=center height="40" valign=middle><font size=5><b>Linux网络编程--4. 完整的读写函数</b></font></td></tr><tr> <td align=center height="20"><font color=#999999><small>http://linuxc.51.net 作者:hoyt<hoytluo@21cn.com> (2001-05-08 11:20:52)</small></font></td></tr><td align=center><table border="0" width="80%" cellspacing="0" cellpadding="0" align=center><tr><td valign=top><font color=#cccccc>
<br>一旦我们建立了连接,我们的下一步就是进行通信了.在Linux下面把我们前面建立的通道 看成是文件描述符,这样服务器端和客户端进行通信时候,只要往文件描述符里面读写东西了. 就象我们往文件读写一样.
<br>
<br>
<br>4.1 写函数write
<br>
<br> ssize_t write(int fd,const void *buf,size_t nbytes)
<br>
<br>write函数将buf中的nbytes字节内容写入文件描述符fd.成功时返回写的字节数.失败时返回-1. 并设置errno变量. 在网络程序中,当我们向套接字文件描述符写时有俩种可能.
<br>
<br>1)write的返回值大于0,表示写了部分或者是全部的数据.
<br>
<br>2)返回的值小于0,此时出现了错误.我们要根据错误类型来处理.
<br>
<br>如果错误为EINTR表示在写的时候出现了中断错误.
<br>
<br>如果为EPIPE表示网络连接出现了问题(对方已经关闭了连接).
<br>
<br>为了处理以上的情况,我们自己编写一个写函数来处理这几种情况.
<br>
<br>
<br>int my_write(int fd,void *buffer,int length)
<br>{
<br> int bytes_left;
<br> int written_bytes;
<br> char *ptr;
<br>
<br> ptr=buffer;
<br> bytes_left=length;
<br> while(bytes_left>0)
<br> {
<br> /* 开始写*/
<br> written_bytes=write(fd,ptr,bytes_left);
<br> if(written_bytes<=0) /* 出错了*/
<br> {
<br> if(errno==EINTR) /* 中断错误 我们继续写*/
<br> written_bytes=0;
<br> else /* 其他错误 没有办法,只好撤退了*/
<br> return(-1);
<br> }
<br> bytes_left-=written_bytes;
<br> ptr+=written_bytes; /* 从剩下的地方继续写 */
<br> }
<br> return(0);
<br>}
<br>
<br>4.2 读函数read
<br>ssize_t read(int fd,void *buf,size_t nbyte) read函数是负责从fd中读取内容.当读成功时,read返回实际所读的字节数,如果返回的值是0 表示已经读到文件的结束了,小于0表示出现了错误.如果错误为EINTR说明读是由中断引起的, 如果是ECONNREST表示网络连接出了问题. 和上面一样,我们也写一个自己的读函数.
<br>
<br>int my_read(int fd,void *buffer,int length)
<br>{
<br> int bytes_left;
<br> int bytes_read;
<br> char *ptr;
<br>
<br> bytes_left=length;
<br> while(bytes_left>0)
<br> {
<br> bytes_read=read(fd,ptr,bytes_read);
<br> if(bytes_read<0)
<br> {
<br> if(errno==EINTR)
<br> bytes_read=0;
<br> else
<br> return(-1);
<br> }
<br> else if(bytes_read==0)
<br> break;
<br> bytes_left-=bytes_read;
<br> ptr+=bytes_read;
<br> }
<br> return(length-bytes_left);
<br>}
<br>
<br>4.3 数据的传递
<br>有了上面的两个函数,我们就可以向客户端或者是服务端传递数据了.比如我们要传递一个结构.可以使用如下方式
<br>
<br> /* 客户端向服务端写 */
<br>
<br> struct my_struct my_struct_client;
<br> write(fd,(void *)&my_struct_client,sizeof(struct my_struct);
<br>
<br> /* 服务端的读*/
<br> char buffer[sizeof(struct my_struct)];
<br> struct *my_struct_server;
<br> read(fd,(void *)buffer,sizeof(struct my_struct));
<br> my_struct_server=(struct my_struct *)buffer;
<br>
<br>在网络上传递数据时我们一般都是把数据转化为char类型的数据传递.接收的时候也是一样的 注意的是我们没有必要在网络上传递指针(因为传递指针是没有任何意义的,我们必须传递指针所指向的内容)
<br></font></td></tr><tr><td><hr></td></tr><form method=post action=/cgi-bin/find.cgi><tr><td><b>相关文章</b> 关键词 <input type=text name=key value='Linux网络编程'> <input type=submit value=搜索></td></tr></form><tr><td><a href=/a4/b7/20010508/112014.html>Linux网络编程--3. 服务器和客户机的信息函数</a> <small>(2001-05-08 11:20:14)</small></font><br><a href=/a4/b7/20010508/111934.html>Linux网络编程--2. 初等网络函数介绍(TCP)</a> <small>(2001-05-08 11:19:34)</small></font><br><a href=/a4/b7/20010508/111655.html>Linux网络编程--1. Linux网络知识介绍</a> <small>(2001-05-08 11:16:55)</small></font><br></td></tr><tr><td> </td></tr></table></td></tr><tr> <td width="100%" height="2" colspan="5" bgcolor="#D09F0D"><img src="/images/c.gif" width=1 height=1></td> </tr><tr> <td width="100%" height="40" colspan="5" valign=top><p align="center"><font color=#ffffff>© 樊强制作 欢迎分享 2001 </font></p></td> </tr></table></center></div><img src="/cgi-bin/pagehit.cgi?filename=a4/b7/20010508/112052.html" width=1 height=1></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -