[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 編程技術 > 網絡編程 > 正文
Linux網絡編程--6. 高級套接字函數
http://linuxc.51.net 作者:hoyt (2001-05-08 11:22:09)

    在前面的幾個部分裡面,我們已經學會了怎樣從網絡上讀寫信息了.前面的一些函數(read,write)是網絡程序裡面最基本的函數.也是最原始的通信函數.在這一章裡面,我們一起來學習網絡通信的高級函數.這一章我們學習另外幾個讀寫函數. 

6.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得到詳細解釋. 

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

6.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的選項一樣 
6.4 套接字的關閉 
關閉套接字有兩個函數close和shutdown.用close時和我們關閉文件一樣. 

6.5 shutdown 

 int shutdown(int sockfd,int howto)  

TCP連接是雙向的(是可讀寫的),當我們使用close時,會把讀寫通道都關閉,有時侯我們希望只關閉一個方向,這個時候我們可以使用shutdown.針對不同的howto,系統回採取不同的關閉方式. 
howto=0這個時候系統會關閉讀通道.但是可以繼續往接字描述符寫. 

howto=1關閉寫通道,和上面相反,著時候就只可以讀了. 

howto=2關閉讀寫通道,和close一樣 在多進程程序裡面,如果有幾個子進程共享一個套接字時,如果我們使用shutdown, 那所有的子進程都不能夠操作了,這個時候我們只能夠使用close來關閉子進程的套接字描述符. 
(http://www.fanqiang.com)
    進入【UNIX論壇

相關文章
Proxy源代碼分析--談談如何學習linux網絡編程 (2001-08-10 12:00:00)
Linux網絡編程--10. 原始套接字 --11. 記 (2001-05-08 11:26:09)
Linux網絡編程--9. 服務器模型 (2001-05-08 11:23:59)
Linux網絡編程--8. 套接字選項 (2001-05-08 11:23:24)
Linux網絡編程--7. TCP/IP協議 (2001-05-08 11:22:40)
Linux網絡編程--6. 高級套接字函數 (2001-05-08 11:22:09)
Linux網絡編程--5. 用戶數據報發送 (2001-05-08 11:21:31)
Linux網絡編程--4. 完整的讀寫函數 (2001-05-08 11:20:52)
Linux網絡編程--3. 服務器和客戶機的信息函數 (2001-05-08 11:20:14)
Linux網絡編程--2. 初等網絡函數介紹(TCP) (2001-05-08 11:19:34)

===更多相關===
 

★  樊強制作 歡迎分享  ★