Linux網(wǎng)絡編程--6. 高級套接字函數(shù)http://linuxc.51.net 作者:hoyt (2001-05-08 11:22:09)
在前面的幾個部分里面,我們已經(jīng)學會了怎么樣從網(wǎng)絡上讀寫信息了.前面的一些函數(shù)(read,write)是網(wǎng)絡程序里面最基本的函數(shù).也是最原始的通信函數(shù).在這一章里面,我們一起來學習網(wǎng)絡通信的高級函數(shù).這一章我們學習另外幾個讀寫函數(shù).
6.1 recv和send
recv和send函數(shù)提供了和read和write差不多的功能.不過它們提供 了第四個參數(shù)來控制讀寫操作.
int recv(int sockfd,void *buf,int len,int flags)
int send(int sockfd,void *buf,int len,int flags)
前面的三個參數(shù)和read,write一樣,第四個參數(shù)可以是0或者是以下的組合
_______________________________________________________________
| MSG_DONTROUTE | 不查找路由表 |
| MSG_OOB | 接受或者發(fā)送帶外數(shù)據(jù) |
| MSG_PEEK | 查看數(shù)據(jù),并不從系統(tǒng)緩沖區(qū)移走數(shù)據(jù) |
| MSG_WAITALL | 等待所有數(shù)據(jù) |
|--------------------------------------------------------------|
MSG_DONTROUTE:是send函數(shù)使用的標志.這個標志告訴IP協(xié)議.目的主機在本地網(wǎng)絡上面,沒有必要查找路由表.這個標志一般用網(wǎng)絡診斷和路由程序里面.
MSG_OOB:表示可以接收和發(fā)送帶外的數(shù)據(jù).關于帶外數(shù)據(jù)我們以后會解釋的.
MSG_PEEK:是recv函數(shù)的使用標志,表示只是從系統(tǒng)緩沖區(qū)中讀取內(nèi)容,而不清楚系統(tǒng)緩沖區(qū)的內(nèi)容.這樣下次讀的時候,仍然是一樣的內(nèi)容.一般在有多個進程讀寫數(shù)據(jù)時可以使用這個標志.
MSG_WAITALL是recv函數(shù)的使用標志,表示等到所有的信息到達時才返回.使用這個標志的時候recv回一直阻塞,直到指定的條件滿 足,或者是發(fā)生了錯誤. 1)當讀到了指定的字節(jié)時,函數(shù)正常返回.返回值等于len 2)當讀到了文件的結(jié)尾時,函數(shù)正常返回.返回值小于len 3) 當操作發(fā)生錯誤時,返回-1,且設置錯誤為相應的錯誤號(errno)
如果flags為0,則和read,write一樣的操作.還有其它的幾個選項,不過我們實際上用的很少,可以查看 Linux Programmer‘s Manual得到詳細解釋.
6.2 recvfrom和sendto
這兩個函數(shù)一般用在非套接字的網(wǎng)絡程序當中(UDP),我們已經(jīng)在前面學會了.
6.3 recvmsg和sendmsg
recvmsg和sendmsg可以實現(xiàn)前面所有的讀寫函數(shù)的功能.
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; /* 緩沖區(qū)開始的地址 */
size_t iov_len; /* 緩沖區(qū)的長度 */
}
msg_name和 msg_namelen當套接字是非面向連接時(UDP),它們存儲接收和發(fā)送方的地址信息.msg_name實際上是一個 指向struct sockaddr的指針,msg_name是結(jié)構(gòu)的長度.當套接字是面向連接時,這兩個值應設為NULL. msg_iov和 msg_iovlen指出接受和發(fā)送的緩沖區(qū)內(nèi)容.msg_iov是一個結(jié)構(gòu)指針,msg_iovlen指出這個結(jié)構(gòu)數(shù)組的大小. msg_control和msg_controllen這兩個變量是用來接收和發(fā)送控制數(shù)據(jù)時的 msg_flags指定接受和發(fā)送的操作選項.和 recv,send的選項一樣
6.4 套接字的關閉
關閉套接字有兩個函數(shù)close和shutdown.用close時和我們關閉文件一樣.
6.5 shutdown
int shutdown(int sockfd,int howto)
TCP連接是雙向的(是可讀寫的),當我們使用close時,會把讀寫通道都關閉,有時侯我們希望只關閉一個方向,這個時候我們可以使用shutdown.針對不同的howto,系統(tǒng)回采取不同的關閉方式.
howto=0這個時候系統(tǒng)會關閉讀通道.但是可以繼續(xù)往接字描述符寫.
howto=1關閉寫通道,和上面相反,著時候就只可以讀了.
howto=2關閉讀寫通道,和close一樣 在多進程程序里面,如果有幾個子進程共享一個套接字時,如果我們使用shutdown, 那么所有的子進程都不能夠操作了,這個時候我們只能夠使用close來關閉子進程的套接字描述符.
(
http://www.fanqiang.com) 進入【
UNIX論壇】