?? linux網(wǎng)絡(luò)編程--4. 完整的讀寫函數(shù).html
字號:
<html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><meta name="GENERATOR" content="Microsoft FrontPage 3.0"><title>[ 永遠(yuǎn)的UNIX > Linux網(wǎng)絡(luò)編程--4. 完整的讀寫函數(shù) ]</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="[ 永遠(yuǎn)的UNIX::一個(gè)UNIX系統(tǒng)管理員的網(wǎng)上家園 ]"></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>編程技術(shù)</a> > <a href=/a4/b7/index.html>網(wǎng)絡(luò)編程</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網(wǎng)絡(luò)編程--4. 完整的讀寫函數(shù)</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>一旦我們建立了連接,我們的下一步就是進(jìn)行通信了.在Linux下面把我們前面建立的通道 看成是文件描述符,這樣服務(wù)器端和客戶端進(jìn)行通信時(shí)候,只要往文件描述符里面讀寫東西了. 就象我們往文件讀寫一樣.
<br>
<br>
<br>4.1 寫函數(shù)write
<br>
<br> ssize_t write(int fd,const void *buf,size_t nbytes)
<br>
<br>write函數(shù)將buf中的nbytes字節(jié)內(nèi)容寫入文件描述符fd.成功時(shí)返回寫的字節(jié)數(shù).失敗時(shí)返回-1. 并設(shè)置errno變量. 在網(wǎng)絡(luò)程序中,當(dāng)我們向套接字文件描述符寫時(shí)有倆種可能.
<br>
<br>1)write的返回值大于0,表示寫了部分或者是全部的數(shù)據(jù).
<br>
<br>2)返回的值小于0,此時(shí)出現(xiàn)了錯(cuò)誤.我們要根據(jù)錯(cuò)誤類型來處理.
<br>
<br>如果錯(cuò)誤為EINTR表示在寫的時(shí)候出現(xiàn)了中斷錯(cuò)誤.
<br>
<br>如果為EPIPE表示網(wǎng)絡(luò)連接出現(xiàn)了問題(對方已經(jīng)關(guān)閉了連接).
<br>
<br>為了處理以上的情況,我們自己編寫一個(gè)寫函數(shù)來處理這幾種情況.
<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) /* 出錯(cuò)了*/
<br> {
<br> if(errno==EINTR) /* 中斷錯(cuò)誤 我們繼續(xù)寫*/
<br> written_bytes=0;
<br> else /* 其他錯(cuò)誤 沒有辦法,只好撤退了*/
<br> return(-1);
<br> }
<br> bytes_left-=written_bytes;
<br> ptr+=written_bytes; /* 從剩下的地方繼續(xù)寫 */
<br> }
<br> return(0);
<br>}
<br>
<br>4.2 讀函數(shù)read
<br>ssize_t read(int fd,void *buf,size_t nbyte) read函數(shù)是負(fù)責(zé)從fd中讀取內(nèi)容.當(dāng)讀成功時(shí),read返回實(shí)際所讀的字節(jié)數(shù),如果返回的值是0 表示已經(jīng)讀到文件的結(jié)束了,小于0表示出現(xiàn)了錯(cuò)誤.如果錯(cuò)誤為EINTR說明讀是由中斷引起的, 如果是ECONNREST表示網(wǎng)絡(luò)連接出了問題. 和上面一樣,我們也寫一個(gè)自己的讀函數(shù).
<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 數(shù)據(jù)的傳遞
<br>有了上面的兩個(gè)函數(shù),我們就可以向客戶端或者是服務(wù)端傳遞數(shù)據(jù)了.比如我們要傳遞一個(gè)結(jié)構(gòu).可以使用如下方式
<br>
<br> /* 客戶端向服務(wù)端寫 */
<br>
<br> struct my_struct my_struct_client;
<br> write(fd,(void *)&my_struct_client,sizeof(struct my_struct);
<br>
<br> /* 服務(wù)端的讀*/
<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>在網(wǎng)絡(luò)上傳遞數(shù)據(jù)時(shí)我們一般都是把數(shù)據(jù)轉(zhuǎn)化為char類型的數(shù)據(jù)傳遞.接收的時(shí)候也是一樣的 注意的是我們沒有必要在網(wǎng)絡(luò)上傳遞指針(因?yàn)閭鬟f指針是沒有任何意義的,我們必須傳遞指針?biāo)赶虻膬?nèi)容)
<br></font></td></tr><tr><td><hr></td></tr><form method=post action=/cgi-bin/find.cgi><tr><td><b>相關(guān)文章</b> 關(guān)鍵詞 <input type=text name=key value='Linux網(wǎng)絡(luò)編程'> <input type=submit value=搜索></td></tr></form><tr><td><a href=/a4/b7/20010508/112014.html>Linux網(wǎng)絡(luò)編程--3. 服務(wù)器和客戶機(jī)的信息函數(shù)</a> <small>(2001-05-08 11:20:14)</small></font><br><a href=/a4/b7/20010508/111934.html>Linux網(wǎng)絡(luò)編程--2. 初等網(wǎng)絡(luò)函數(shù)介紹(TCP)</a> <small>(2001-05-08 11:19:34)</small></font><br><a href=/a4/b7/20010508/111655.html>Linux網(wǎng)絡(luò)編程--1. Linux網(wǎng)絡(luò)知識介紹</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>© 樊強(qiáng)制作 歡迎分享 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>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -