国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

完整的讀寫函數(shù)

2019-11-17 05:32:11
字體:
供稿:網(wǎng)友

  一旦我們建立了連接,我們的下一步就是進(jìn)行通信了.在linux下面把我們前面建立的通道 看成是文件描述符,這樣服務(wù)器端和客戶端進(jìn)行通信時(shí)候,只要往文件描述符里面讀寫東西了. 就象我們往文件讀寫一樣.


4.1 寫函數(shù)write

ssize_t write(int fd,const void *buf,size_t nbytes)

write函數(shù)將buf中的nbytes字節(jié)內(nèi)容寫入文件描述符fd.成功時(shí)返回寫的字節(jié)數(shù).失敗時(shí)返回-1. 并設(shè)置errno變量. 在網(wǎng)絡(luò)程序中,當(dāng)我們向套接字文件描述符寫時(shí)有倆種可能.

1)write的返回值大于0,表示寫了部分或者是全部的數(shù)據(jù).

2)返回的值小于0,此時(shí)出現(xiàn)了錯(cuò)誤.我們要根據(jù)錯(cuò)誤類型來處理.

假如錯(cuò)誤為EINTR表示在寫的時(shí)候出現(xiàn)了中斷錯(cuò)誤.

假如為EPipE表示網(wǎng)絡(luò)連接出現(xiàn)了問題(對(duì)方已經(jīng)關(guān)閉了連接).

為了處理以上的情況,我們自己編寫一個(gè)寫函數(shù)來處理這幾種情況.


int my_write(int fd,void *buffer,int length)
{
int bytes_left;
int written_bytes;
char *ptr;

ptr=buffer;
bytes_left=length;
while(bytes_left>0)
{
/* 開始寫*/
written_bytes=write(fd,ptr,bytes_left);
if(written_bytes<=0) /* 出錯(cuò)了*/
{
if(errno==EINTR) /* 中斷錯(cuò)誤 我們繼續(xù)寫*/
written_bytes=0;
else /* 其他錯(cuò)誤 沒有辦法,只好撤退了*/
return(-1);
}
bytes_left-=written_bytes;
ptr+=written_bytes; /* 從剩下的地方繼續(xù)寫 */
}
return(0);
}

4.2 讀函數(shù)read
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ù).

int my_read(int fd,void *buffer,int length)
{
int bytes_left;
int bytes_read;
char *ptr;

bytes_left=length;
while(bytes_left>0)
{
bytes_read=read(fd,ptr,bytes_read);
if(bytes_read<0)
{
if(errno==EINTR)
bytes_read=0;
else
return(-1);
}
else if(bytes_read==0)
break;
bytes_left-=bytes_read;
ptr+=bytes_read;
}
return(length-bytes_left);
}

4.3 數(shù)據(jù)的傳遞
有了上面的兩個(gè)函數(shù),我們就可以向客戶端或者是服務(wù)端傳遞數(shù)據(jù)了.比如我們要傳遞一個(gè)結(jié)構(gòu).可以使用如下方式

/* 客戶端向服務(wù)端寫 */

strUCt my_struct my_struct_client;
write(fd,(void *)&my_struct_client,sizeof(struct my_struct);

/* 服務(wù)端的讀*/
char buffer[sizeof(struct my_struct)];
struct *my_struct_server;
read(fd,(void *)buffer,sizeof(struct my_struct));
my_struct_server=(struct my_struct *)buffer;

在網(wǎng)絡(luò)上傳遞數(shù)據(jù)時(shí)我們一般都是把數(shù)據(jù)轉(zhuǎn)化為char類型的數(shù)據(jù)傳遞.接收的時(shí)候也是一樣的 注重的是我們沒有必要在網(wǎng)絡(luò)上傳遞指針(因?yàn)閭鬟f指針是沒有任何意義的,我們必須傳遞指針?biāo)赶虻膬?nèi)容)


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 孙吴县| 广昌县| 兴化市| 仲巴县| 香港 | 和硕县| 永德县| 宁陵县| 余干县| 新源县| 阳春市| 麻江县| 磐安县| 涞水县| 武宣县| 旬邑县| 中江县| 龙里县| 新沂市| 壤塘县| 宝兴县| 蒲城县| 全州县| 日照市| 临猗县| 海宁市| 锦州市| 富宁县| 罗城| 尼木县| 天水市| 南和县| 洛南县| 东兴市| 灵寿县| 沙河市| 宾川县| 宁乡县| 城市| 苍山县| 聂荣县|