1. 程式人生 > >linux socket網路程式設計之socket屬性

linux socket網路程式設計之socket屬性

1.函式用法:
#include <sys/types.h>          
#include <sys/socket.h>
int getsockopt(int sockfd, int level, int optname,void *optval, socklen_t *optlen);
//函式用於獲得某個套接字的屬性
int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);
//允許限制某個套接字的屬性。



2.返回說明:  
成功執行時,返回0。
失敗時,返回-1,errno被設為以下的某個值  
EBADF:sock不是有效的檔案描述詞
EFAULT:optval指向的記憶體並非有效的程序空間
EINVAL:在呼叫setsockopt()時,optlen無效
ENOPROTOOPT:指定的協議層不能識別選項
ENOTSOCK:sock描述的不是套接字




3.引數說明:
第1個引數sockfd是一個套接字描述符。即獲取或者設定哪一個socket的屬性。    
第2個引數level型別為int,指定控制套接字屬性的分類,標識某個協議級別。level可以取如下所示多種值:
#define SOL_SOCKET 1

//通用套接字選項

#define IPPROTO_IP 0

//IP選項

#define IPPROTO_TCP 6

//TCP選項

第3個引數optname指定控制的引數,即在某個特定級別下的選項。

    



第4個引數optval獲得或者是設定套接字選項值,根據選項名稱的資料型別進行轉換。
第5個引數為&int,含義是緩衝區大小,返回時為所發現的值的長度。




4.使用說明:
//環境Ubuntu 10.04
4.1設定傳送快取區和接收快取區大小
int sndbuf_size=64*1024;//設定為64k 
int rcvbuf_size=64*1024;
setsockopt(sock_fd,SOL_SOCKET,SO_SNDBUF,(const char *)&sndbuf_size,sizeof(int));
setsockopt(sock_fd,SOL_SOCKET,SO_RCVBUF,(const char *)&rcvbuf_size,sizeif(int));
注意:
1)預設值sndbuf_size=16k,recvbuf_size=85.3k。
2)在快取區允許設定的最大值內,快取區的大小會設定為sndbuf_size/recvbuf_size的2倍(128k)。
3)快取區允許設定的最大值為262142Bytes(約256k)。


4.2設定傳送和接收的超時時間
struct timeval set_time;

set_time.tv_sec=1;

set_time.tv_usec=0;
setsockopt(sock_fd,SOL_SOCKET,SO_SNDTIMEO,&set_time,sizeof(struct timeval));
setsockopt(sock_fd,SOL_SOCKET,SO_RCVTIMEO,&set_time,sizeof(struct timeval));
注意:
1)對於阻塞態系統呼叫send(sock_fd,snd_buf,64,0)/recv(sock_fd,rcv_buf,64,0),setsockopt來設定超時時間是有效的。
2)對於非阻塞態系統呼叫send(sock_fd,snd_buf,64,MSG_DONTWAIT)/recv(sock_fd,rcv_buf,64,MSG_DONTWAIT),setsockopt來設定超時時間後,
recv接收不到資料,立即返回一個錯誤資訊。ps:非阻塞態超時時間如何正確設定還不是很清楚。


4.3設定不使用Nagle演算法
const int chOpt = 1;
setsockopt(sock_fd,IPPROTO_TCP,TCP_NODELAY,&chOpt,sizeof(int))
注意:
    1)Nagle演算法就是為了儘可能傳送大塊資料,避免網路中充斥著許多小資料塊。預設情況下,傳送資料採用Nagle 演算法。這樣雖然提高了網路吞吐量,但是實時性卻降低了,在一些互動性很強的應用程式來說是不允許的,使用TCP_NODELAY選項可以禁止Negale 演算法。

//關於Nagle演算法更多細節請參考 http://blog.csdn.net/ithzhang/article/details/8520026

//關於設定socket屬性的更多細節請參考 http://blog.chinaunix.net/uid-24517549-id-4044883.html,本文只對主要關注的幾點進行說明。


5.參考文獻:
《linux高階程式設計》