write/read/send/receive函数比较
建立好TCP連接后,就可以把得到的套接字當(dāng)做文件描述符來使用,由此,聯(lián)系到網(wǎng)絡(luò)程序里的基本讀寫函數(shù),write、read;
l write函數(shù):
Ssize_t write(int fd,const void *buf,size_t nbytes);
Write函數(shù)將buf中的nbytes字節(jié)內(nèi)容寫入到文件描述符中,成功返回寫的字節(jié)數(shù),失敗返回-1.并設(shè)置errno變量。在網(wǎng)絡(luò)程序中,當(dāng)我們向套接字文件描述寫數(shù)據(jù)時(shí)有兩種可能:
1. write的返回值大于0,表示寫了部分?jǐn)?shù)據(jù)或者是全部的數(shù)據(jù),這樣用一個(gè)while循環(huán)不斷的寫入數(shù)據(jù),但是循環(huán)過程中的buf參數(shù)和nbytes參數(shù)是我們自己來更新的,也就是說,網(wǎng)絡(luò)編程中寫函數(shù)是不負(fù)責(zé)將全部數(shù)據(jù)寫完之后再返回的,說不定中途就返回了!
2. 返回值小于0,此時(shí)出錯(cuò)了,需要根據(jù)錯(cuò)誤類型進(jìn)行相應(yīng)的處理。
如果錯(cuò)誤是EINTR表示在寫的時(shí)候出現(xiàn)了中斷錯(cuò)誤,如果是EPIPE表示網(wǎng)絡(luò)連接出現(xiàn)了問題。
l read函數(shù):
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表示是讀取錯(cuò)誤。
如果錯(cuò)誤是EINTR表示在寫的時(shí)候出現(xiàn)了中斷錯(cuò)誤,如果是EPIPE表示網(wǎng)絡(luò)連接出現(xiàn)了問題。
有了上面的兩個(gè)函數(shù),我們就可以向客戶端或者是服務(wù)器端進(jìn)行數(shù)據(jù)傳輸了!比如我要傳送一個(gè)結(jié)構(gòu)體,可以使用下面的方法:
客戶端向服務(wù)器:
Struct student stu;
Write(sock,(void *)&stu,sizeof(struct student));
服務(wù)器讀:
Char buffer[sizeof(struct student)];
Struct *my_student;
Read(sock,(void *)buffer,sizeof(struct student));
My_student=(struct student)buffer;
在網(wǎng)絡(luò)上傳遞數(shù)據(jù)時(shí),我們一般把數(shù)據(jù)轉(zhuǎn)換為char類型,接收的時(shí)候也是一樣的的。沒必要在網(wǎng)絡(luò)上傳遞指針。
l Recv函數(shù)和send函數(shù):
Recv函數(shù)和read函數(shù)提供了read和write函數(shù)一樣的功能,不同的是他們提供了四個(gè)參數(shù)。
Int recv(int fd,void *buf,int len,int flags)
Int send(int fd,void *buf,int len,int flags)
前面的三個(gè)參數(shù)和read、write函數(shù)是一樣的。第四個(gè)參數(shù)可以是0或者是一下組合:
? MSG_DONTROUTE:不查找表
是send函數(shù)使用的標(biāo)志,這個(gè)標(biāo)志告訴IP,目的主機(jī)在本地網(wǎng)絡(luò)上,沒有必要查找表,這個(gè)標(biāo)志一般用在網(wǎng)絡(luò)診斷和路由程序里面。
? MSG_OOB:接受或者發(fā)生帶外數(shù)據(jù)
表示可以接收和發(fā)送帶外數(shù)據(jù)。
? MSG_PEEK:查看數(shù)據(jù),并不從系統(tǒng)緩沖區(qū)移走數(shù)據(jù)
是recv函數(shù)使用的標(biāo)志,表示只是從系統(tǒng)緩沖區(qū)中讀取內(nèi)容,而不清楚系統(tǒng)緩沖區(qū)的內(nèi)容。這樣在下次讀取的時(shí)候,依然是一樣的內(nèi)容,一般在有過個(gè)進(jìn)程讀寫數(shù)據(jù)的時(shí)候使用這個(gè)標(biāo)志。
? MSG_WAITALL:等待所有數(shù)據(jù)
是recv函數(shù)的使用標(biāo)志,表示等到所有的信息到達(dá)時(shí)才返回,使用這個(gè)標(biāo)志的時(shí)候,recv返回一直阻塞,直到指定的條件滿足時(shí),或者是發(fā)生了錯(cuò)誤。
轉(zhuǎn)載于:https://www.cnblogs.com/davidsguo008/p/3591522.html
總結(jié)
以上是生活随笔為你收集整理的write/read/send/receive函数比较的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux系统安全审计工具Lynis
- 下一篇: position:fixed和scrol