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

2021-07-24 22:28:51 字數 2516 閱讀 7494

1.函式用法:

#include

#include

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 演算法。

,本文只對主要關注的幾點進行說明。

《linux高階程式設計》

linux socket 網路程式設計入門

客戶端原始碼 include include include include include include include include int main int argc,char argv their addr.sin family af inet their addr.sin port h...

linux socket 程式設計

兩段程式 可用於開發板和主機之間的資料傳輸,很管用!file client.c檔案傳輸客戶端程式示例 本檔案是客戶機的 include for sockaddr in include for socket include for socket include for printf include f...

linux socket程式設計

雙休日無聊透頂,看了四五集 反恐24小時 實在不想看了,於是就想搞linux的socket programming來玩玩,前期資料都準備好 早就想寫個看看了。首先,寫個簡單的client端的程式 呵,其實是copy!server端用的是網上當的乙個除錯工具 一開始用的是以前用過的乙個多執行緒執行的介...