⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 linux网络编程--4. 完整的读写函数.html

📁 Linux网络编程
💻 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下面把我们前面建立的通道&nbsp;看成是文件描述符,这样服务器端和客户端进行通信时候,只要往文件描述符里面读写东西了.&nbsp;就象我们往文件读写一样.&nbsp;
<br>
<br>
<br>4.1&nbsp;写函数write&nbsp;
<br>
<br>&nbsp;ssize_t&nbsp;write(int&nbsp;fd,const&nbsp;void&nbsp;*buf,size_t&nbsp;nbytes)
<br>
<br>write函数将buf中的nbytes字节内容写入文件描述符fd.成功时返回写的字节数.失败时返回-1.&nbsp;并设置errno变量.&nbsp;在网络程序中,当我们向套接字文件描述符写时有俩种可能.&nbsp;
<br>
<br>1)write的返回值大于0,表示写了部分或者是全部的数据.&nbsp;
<br>
<br>2)返回的值小于0,此时出现了错误.我们要根据错误类型来处理.&nbsp;
<br>
<br>如果错误为EINTR表示在写的时候出现了中断错误.&nbsp;
<br>
<br>如果为EPIPE表示网络连接出现了问题(对方已经关闭了连接).&nbsp;
<br>
<br>为了处理以上的情况,我们自己编写一个写函数来处理这几种情况.&nbsp;
<br>
<br>
<br>int&nbsp;my_write(int&nbsp;fd,void&nbsp;*buffer,int&nbsp;length)
<br>{
<br>&nbsp;int&nbsp;bytes_left;
<br>&nbsp;int&nbsp;written_bytes;
<br>&nbsp;char&nbsp;*ptr;
<br>
<br>&nbsp;ptr=buffer;
<br>&nbsp;bytes_left=length;
<br>&nbsp;while(bytes_left>0)
<br>&nbsp;{
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;开始写*/
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;written_bytes=write(fd,ptr,bytes_left);
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(written_bytes<=0)&nbsp;/*&nbsp;出错了*/
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(errno==EINTR)&nbsp;/*&nbsp;中断错误&nbsp;我们继续写*/
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;written_bytes=0;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;其他错误&nbsp;没有办法,只好撤退了*/
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(-1);
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bytes_left-=written_bytes;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr+=written_bytes;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;从剩下的地方继续写&nbsp;&nbsp;*/
<br>&nbsp;}
<br>&nbsp;return(0);
<br>}
<br>
<br>4.2&nbsp;读函数read&nbsp;
<br>ssize_t&nbsp;read(int&nbsp;fd,void&nbsp;*buf,size_t&nbsp;nbyte)&nbsp;read函数是负责从fd中读取内容.当读成功时,read返回实际所读的字节数,如果返回的值是0&nbsp;表示已经读到文件的结束了,小于0表示出现了错误.如果错误为EINTR说明读是由中断引起的,&nbsp;如果是ECONNREST表示网络连接出了问题.&nbsp;和上面一样,我们也写一个自己的读函数.&nbsp;
<br>
<br>int&nbsp;my_read(int&nbsp;fd,void&nbsp;*buffer,int&nbsp;length)
<br>{
<br>&nbsp;int&nbsp;bytes_left;
<br>&nbsp;int&nbsp;bytes_read;
<br>&nbsp;char&nbsp;*ptr;
<br>&nbsp;&nbsp;
<br>&nbsp;bytes_left=length;
<br>&nbsp;while(bytes_left>0)
<br>&nbsp;{
<br>&nbsp;&nbsp;&nbsp;bytes_read=read(fd,ptr,bytes_read);
<br>&nbsp;&nbsp;&nbsp;if(bytes_read<0)
<br>&nbsp;&nbsp;&nbsp;{
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(errno==EINTR)
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bytes_read=0;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(-1);
<br>&nbsp;&nbsp;&nbsp;}
<br>&nbsp;&nbsp;&nbsp;else&nbsp;if(bytes_read==0)
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
<br>&nbsp;&nbsp;&nbsp;&nbsp;bytes_left-=bytes_read;
<br>&nbsp;&nbsp;&nbsp;&nbsp;ptr+=bytes_read;
<br>&nbsp;}
<br>&nbsp;return(length-bytes_left);
<br>}
<br>
<br>4.3&nbsp;数据的传递&nbsp;
<br>有了上面的两个函数,我们就可以向客户端或者是服务端传递数据了.比如我们要传递一个结构.可以使用如下方式&nbsp;
<br>
<br>&nbsp;/*&nbsp;&nbsp;客户端向服务端写&nbsp;*/
<br>
<br>&nbsp;struct&nbsp;my_struct&nbsp;my_struct_client;
<br>&nbsp;write(fd,(void&nbsp;*)&my_struct_client,sizeof(struct&nbsp;my_struct);
<br>
<br>&nbsp;/*&nbsp;服务端的读*/&nbsp;
<br>&nbsp;char&nbsp;buffer[sizeof(struct&nbsp;my_struct)];
<br>&nbsp;struct&nbsp;*my_struct_server;
<br>&nbsp;read(fd,(void&nbsp;*)buffer,sizeof(struct&nbsp;my_struct));&nbsp;
<br>&nbsp;my_struct_server=(struct&nbsp;my_struct&nbsp;*)buffer;&nbsp;&nbsp;&nbsp;&nbsp;
<br>
<br>在网络上传递数据时我们一般都是把数据转化为char类型的数据传递.接收的时候也是一样的&nbsp;注意的是我们没有必要在网络上传递指针(因为传递指针是没有任何意义的,我们必须传递指针所指向的内容)&nbsp;
<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>&nbsp;</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>&copy; &nbsp;&nbsp;樊强制作 欢迎分享 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 + -