Linux網路程式設計--高階套接字函式(轉)
Linux網路程式設計--高階套接字函式(轉)[@more@]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來關閉子程式的套接字描述符.
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來關閉子程式的套接字描述符.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-947771/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Linux網路程式設計--原始套接字(轉)Linux程式設計
- 函數語言程式設計 - 玩轉高階回撥函式函數程式設計函式
- 《UNIX網路程式設計》筆記 - 套接字選項/UDP套接字程式設計筆記UDP
- Linux網路程式設計--初等網路函式介紹(TCP)(轉)Linux程式設計函式TCP
- Java套接字程式設計Java程式設計
- 函數語言程式設計(2) 高階函式函數程式設計函式
- 網路套接字
- Python 函數語言程式設計 – 高階函式Python函數程式設計函式
- 函數語言程式設計4-高階函式函數程式設計函式
- scala簡明教程:偏函式、高階函式、Future非同步程式設計、隱式轉換函式非同步程式設計
- UNIX網路程式設計(6)--套接字地址結構、通用套接字地址結構程式設計
- Linux系統程式設計(37)—— socket程式設計之原始套接字Linux程式設計
- 基本TCP套接字程式設計APITCP程式設計API
- Python原始套接字程式設計Python程式設計
- 好程式設計師大資料學習路線分享高階函式程式設計師大資料函式
- Linux作業系統套接字程式設計的5個隱患(轉)Linux作業系統程式設計
- Linux網路程式設計之原始套接字-ping協議實現Linux程式設計協議
- Python函數語言程式設計-高階函式、匿名函式、裝飾器、偏函式Python函數程式設計函式
- Linux網路程式設計--完整的讀寫函式(轉)Linux程式設計函式
- 『設計模式』高階函式實現 AOP設計模式函式
- 計算機網路之十一:套接字Socket計算機網路
- Java網路通訊套接字Java
- 設計模式基礎 之 4 高階函式設計模式函式
- 【Linux網路程式設計】Socket Api函式Linux程式設計API函式
- 14.1 Socket 套接字程式設計入門程式設計
- 高質量C++/C程式設計指南(第8章 C++函式的高階特性) (轉)C++C程式程式設計函式
- 13.程式程式設計進階:函式程式設計函式
- 高階函式函式
- Linux :套接字Linux
- 從高階函式--->高階元件函式元件
- Python 函式進階-高階函式Python函式
- 【網路程式設計】TCPIP-8-套接字的多種選項程式設計TCP
- C# 2.0 套接字程式設計例項初探程式設計
- 高質量C++/C程式設計指南(第6章 函式設計) (轉)C++C程式程式設計函式
- oracle 高階函式Oracle函式
- Javascript 高階函式JavaScript函式
- 函式高階玩法函式
- 《javascript高階程式設計》學習筆記 | 11.3.非同步函式JavaScript程式設計筆記非同步函式