TCP/IP编程之getsockopt/setsockopt函数详解
前述:
有很多方法來獲取和設(shè)置影響套接字的選項(xiàng):
· getsockopt和setsockopt函數(shù)
· fcntl函數(shù),是把套接字設(shè)置為非阻塞式I/O型或者信號(hào)驅(qū)動(dòng)式I/O型以及設(shè)置套接字屬主的POSIX的方式
· ioctl函數(shù)
這篇文章只討論getsockopt和setsockopt函數(shù)
函數(shù)原型:
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,若出錯(cuò)返回-1
參數(shù)說明(以下文字務(wù)必細(xì)看):
其中sockfd必須指向一個(gè)打開的套接字描述符,level(級(jí)別)指定系統(tǒng)中解析選項(xiàng)的代碼或?yàn)橥ㄓ锰捉幼执a,或?yàn)槟硞€(gè)特定于協(xié)議的代碼(例如IPv4、IPv6、TCP或SCTP)
optval是一個(gè)指向某個(gè)變量(*optval)的指針,setsockopt從*optval中取得選項(xiàng)代設(shè)置的新值,getsockopt則把已獲取的選項(xiàng)當(dāng)前值存放到*optval中。*optval的大小由最后一個(gè)參數(shù)指定。
下面兩個(gè)圖匯總了TCP編程中常用的可由getsockopt獲取或者setsockopt設(shè)置的選項(xiàng)。其中的"數(shù)據(jù)類型"列給出了指針optval必須指向的每個(gè)選項(xiàng)的數(shù)據(jù)類型。我們用后跟一對(duì)花括號(hào)的記法來表示一個(gè)結(jié)構(gòu),如linger{}表示struct linger。
套接字的選項(xiàng)粗分為兩大基本類型:
一是啟用或禁止某個(gè)特性的二元選項(xiàng)(稱為標(biāo)志選項(xiàng))。
二是取得并返回我們可以設(shè)置或檢查的特定值的選項(xiàng)(稱為值選項(xiàng))。
上圖中標(biāo)有"標(biāo)志"的列指出一個(gè)選項(xiàng)是否為標(biāo)志選項(xiàng)。當(dāng)給這些標(biāo)志選項(xiàng)調(diào)用getsokopt函數(shù)時(shí),*optval是一個(gè)整數(shù),*optval中返回的值為0表示相應(yīng)選項(xiàng)被禁止,不為0表示選項(xiàng)被啟用。類似地,setsockopt函數(shù)需要一個(gè)不為0的*optval值來啟用選項(xiàng),一個(gè)為0的*optval值來禁止選項(xiàng)。如果上圖中“標(biāo)志”列不含有“·”,那么相應(yīng)選項(xiàng)用于在用戶進(jìn)程和系統(tǒng)之間傳遞所指定數(shù)據(jù)類型的值。
偽代碼,禁用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:有興趣的同學(xué),應(yīng)該把《unix網(wǎng)絡(luò)編程》·卷1·第七章細(xì)看,此文只是摘錄了部分內(nèi)容,并沒有對(duì)optname的選項(xiàng)做細(xì)致的講解分析。
參考:《unix網(wǎng)絡(luò)編程》·卷1
總結(jié)
以上是生活随笔為你收集整理的TCP/IP编程之getsockopt/setsockopt函数详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PTA 7-209 sdut-C语言实验
- 下一篇: ABAQUS学习(2):Abaqus求解