TCP/IP编程之getsockopt/setsockopt函数详解
前述:
有很多方法來獲取和設置影響套接字的選項:
· getsockopt和setsockopt函數
· fcntl函數,是把套接字設置為非阻塞式I/O型或者信號驅動式I/O型以及設置套接字屬主的POSIX的方式
· ioctl函數
這篇文章只討論getsockopt和setsockopt函數
函數原型:
GETSOCKOPT(2) Linux Programmer's Manual GETSOCKOPT(2)NAMEgetsockopt, setsockopt - get and set options on socketsSYNOPSIS#include <sys/types.h> /* See NOTES */#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);返回值:
若成功返回0,若出錯返回-1
參數說明(以下文字務必細看):
其中sockfd必須指向一個打開的套接字描述符,level(級別)指定系統中解析選項的代碼或為通用套接字代碼,或為某個特定于協議的代碼(例如IPv4、IPv6、TCP或SCTP)
optval是一個指向某個變量(*optval)的指針,setsockopt從*optval中取得選項代設置的新值,getsockopt則把已獲取的選項當前值存放到*optval中。*optval的大小由最后一個參數指定。
下面兩個圖匯總了TCP編程中常用的可由getsockopt獲取或者setsockopt設置的選項。其中的"數據類型"列給出了指針optval必須指向的每個選項的數據類型。我們用后跟一對花括號的記法來表示一個結構,如linger{}表示struct linger。
套接字的選項粗分為兩大基本類型:
一是啟用或禁止某個特性的二元選項(稱為標志選項)。
二是取得并返回我們可以設置或檢查的特定值的選項(稱為值選項)。
上圖中標有"標志"的列指出一個選項是否為標志選項。當給這些標志選項調用getsokopt函數時,*optval是一個整數,*optval中返回的值為0表示相應選項被禁止,不為0表示選項被啟用。類似地,setsockopt函數需要一個不為0的*optval值來啟用選項,一個為0的*optval值來禁止選項。如果上圖中“標志”列不含有“·”,那么相應選項用于在用戶進程和系統之間傳遞所指定數據類型的值。
偽代碼,禁用Nagle算法:
sockfd = socket(AF_INET, SOCK_STREAM, 0); flag = 1; int ret = setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (void *)&flag, sizeof(flag)); if (ret == -1) { printf("Couldn't setsockopt(TCP_NODELAY)\n"); }
ps:有興趣的同學,應該把《unix網絡編程》·卷1·第七章細看,此文只是摘錄了部分內容,并沒有對optname的選項做細致的講解分析。
參考:《unix網絡編程》·卷1
總結
以上是生活随笔為你收集整理的TCP/IP编程之getsockopt/setsockopt函数详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PTA 7-209 sdut-C语言实验
- 下一篇: ABAQUS学习(2):Abaqus求解