socket的read和recv函數的區別


1、recv和send
  recv和send函數提供了和read和write差不多的功能.但是他們提供了第四個參數來控制讀寫操作。
int recv(int sockfd,void *buf,int len,int flags)
int send(int sockfd,void *buf,int len,int flags)
前面的三個參數和read,write相同,第四個參數能夠是0或是以下的組合
_______________________________________________________________
 MSG_DONTROUTE:不查找路由表
 MSG_OOB:接受或發送帶外數據
 MSG_PEEK:查看數據,並不從系統緩沖區移走數據
 MSG_WAITALL :等待任何數據
————————————————————–
MSG_DONTROUTE:是send函數使用的標志.這個標志告訴IP協議.目的主機在本地網絡上面,沒有必要查找路由表.這個標志一般用網絡診斷和路由程式里面
MSG_OOB:表示能夠接收和發送帶外的數據.關於帶外數據我們以后會解釋的.
MSG_PEEK:是recv函數的使用標志,表示只是從系統緩沖區中讀取內容,而不清除系統緩沖區的內容。這樣下次讀的時候,仍然是相同的內容。一般在有多個進程讀寫數據時能夠使用這個標志。
MSG_WAITALL:是recv函數的使用標志,表示等到任何的信息到達時才返回。使用這個標志的時候recv會一直阻塞,直到指定的條件滿足,或是發生了錯誤。 1)當讀到了指定的字節時,函數正常返回,返回值等於len 2)當讀到了文檔的結尾時,函數正常返回.返回值小於len 3)當操作發生錯誤時,返回-1,且配置錯誤為相應的錯誤號(errno)
  假如flags為0,則和read,write相同的操作,更有其他的幾個選項,但是我們實際上用的很少,能夠查看 Linux Programmer’s Manual得到周詳解釋。

 

2、recvfrom和sendto
這兩個函數一般用在非套接字的網絡程式當中(UDP),我們已在前面學會了。

 

3、recvmsg和sendmsg
recvmsg和sendmsg能夠實現前面任何的讀寫函數的功能。
int recvmsg(int sockfd,struct msghdr *msg,int flags)
int sendmsg(int sockfd,struct msghdr *msg,int flags)
struct msghdr
{
  void *msg_name;
  int msg_namelen;
  struct iovec *msg_iov;
  int msg_iovlen;
  void *msg_control;
  int msg_controllen;
  int msg_flags;
}


struct iovec
{
  void *iov_base;
  size_t iov_len;
}
  msg_name 和 msg_namelen當套接字是非面向連接時(UDP),他們存儲接收和發送方的地址信息。msg_name實際上是個指向struct sockaddr的指針,msg_name是結構的長度。當套接字是面向連接時,這兩個值應設為NULL。 msg_iov和msg_iovlen指出接受和發送的緩沖區內容。msg_iov是個結構指針,msg_iovlen指出這個結構數組的大小。msg_control和msg_controllen這兩個變量是用來接收和發送控制數據時的 msg_flags指定接受和發送的操作選項。和recv,send的選項相同

 

4、套接字的關閉
關閉套接字有兩個函數close和shutdown.用close時和我們關閉文檔相同。

 

5、shutdown
int shutdown(int sockfd,int howto)
TCP連接是雙向的(是可讀寫的),當我們使用close時,會把讀寫通道都關閉,有時侯我們希望只關閉一個方向,這個時候我們能夠使用shutdown.針對不同的howto,系統回采取不同的關閉方式.
howto=0這個時候系統會關閉讀通道.但是能夠繼續往接字描述符寫.
howto=1關閉寫通道,和上面相反,着時候就只能夠讀了.
howto=2關閉讀寫通道,和close相同在多進程程式里面,假如有幾個子進程共享一個套接字時,假如我們使用shutdown, 那么任何的子進程都不能夠操作了,這個時候我們只能夠使用close來關閉子進程的套接字描述符.


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com