【正文】
該選項(xiàng)的作用是禁止其他進(jìn)程在一個(gè)本。 (18) ?SO_REUSEADDR:該選項(xiàng)可以獲取,也可以設(shè)置,表示該套接口能和一個(gè)已在使用中的地址捆綁。 (16) ?SO_SNDTIMEO:該選項(xiàng)可以獲取,也可以設(shè)置。 (15) ?SO_TYPE:該選項(xiàng)只能獲取 ,??用于返回指定套接口的類型 。 (14) ?SO_SNDBUF:該選項(xiàng)可以獲取 , 也可以設(shè)置 。 該選項(xiàng)由 Winsock 2支持 。 (11) ?SO_OOBINLINE:該選項(xiàng)可以獲取,也可以設(shè)置。在 Windows 95及Windows 98操作系統(tǒng)中,這兩個(gè)鍵都位于下述注冊(cè)表路徑中: \HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\VxD\MSTCP 第 8章 Winsock API 而在 Windows NT和 Windows 20xx中 , 這兩個(gè)鍵位于下述位置: \HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\TCPIP\Parameters 服務(wù)器 (例如 FTP服務(wù)器 )一般要設(shè)置該選項(xiàng) , 這樣當(dāng)客戶在非正常終止連接的情況下 , 經(jīng)過一段時(shí)間后 , 服務(wù)器也能終止該連接 。 (8) ?SO_ERROR:該選項(xiàng)只能獲取,用于返回以具體套接口為基礎(chǔ)的錯(cuò)誤代碼,在返回后系統(tǒng)一般將該選項(xiàng)設(shè)置為 0。表 83總結(jié)了這兩個(gè)選項(xiàng)對(duì)套接口關(guān)閉方式的影響。若在一個(gè)流類套接口上設(shè)置了 SO_DONTLINGER選項(xiàng),也就是說將 linger結(jié)構(gòu)的 l_onoff域設(shè)為 0,則closesocket(?)調(diào)用立即返回,但是,如果可能,排隊(duì)的數(shù)據(jù)將在套接口關(guān)閉之前被發(fā)送。請(qǐng)注意,如果套接口設(shè)置為非阻塞模式且 S O _ L IN G E R 設(shè)為非 0 的超時(shí)值,則 c l o s e s o c k e t ( ) 調(diào)用將以W S A E W O U L D BL O CK 錯(cuò)誤返回 ≠ 0 =0 設(shè)置 調(diào)用 c l o s e s o c k e t ( ) 函數(shù)時(shí),套接口的 T CP 連接被立即關(guān)閉,套接口緩沖區(qū)中未發(fā)送的數(shù)據(jù)丟失,因此這種關(guān)閉方式稱為“強(qiáng)制”或“野蠻”關(guān)閉。 當(dāng) l_onoff和 l_linger字段取不同的值時(shí) , 系統(tǒng)的操作方式也不同 , 它們的取值情況如表 82所示 。 第 8章 Winsock API l_onoff字段用來控制 SO_LINGER選項(xiàng)的打開或關(guān)閉 , 為了使該選項(xiàng)起作用 , 該字段應(yīng)該設(shè)置為一個(gè)非 0的值 。 int l_linger。 它用于控制在 closesocket(?)函數(shù)已執(zhí)行的情況下 ,如何處理套接口數(shù)據(jù)排列上未發(fā)送完畢的數(shù)據(jù) 。 第 8章 Winsock API (5) ?SO_LINGER:該選項(xiàng)值可以獲取 , 也可以設(shè)置 。 若用 SO_DEBUG選項(xiàng)調(diào)用getsockopt(?)函數(shù) , 會(huì)返回 TRUE或 FALSE, 分別代表允許和禁止記錄調(diào)試信息 。 至于調(diào)試信息如何展示 , 要取決于服務(wù)提供者的基層實(shí)施方式 。 (4) ?SO_DEBUG:該選項(xiàng)值可以獲取 , 也可以設(shè)置 。 該選項(xiàng)可以在客戶端的 SOCKET句柄上調(diào)用 , 以判斷連接是否已經(jīng)建立 , 以及建立了多長時(shí)間 。 } …… 第 8章 Winsock API (3) ?SO_CONNECT_TIME:該選項(xiàng)只能獲取 。,WSAGetLastError(?))。setsocketopt(?) Error:u%\n39。bBroadcast,sizeof (BOOL))==SOCKET_ERROR) { printf(39。 //創(chuàng)建一個(gè)數(shù)據(jù)報(bào)套接口 s=socket(AF_INET,SOCK_DGRAM,0)。 要想接收一條廣播消息 , 首先必須啟用廣播選項(xiàng) , 然后使用某個(gè)數(shù)據(jù)報(bào)接收函數(shù) , 比如 recvfrom(?)或WSARecvFrom(?)。 第 8章 Winsock API 廣播是一種特殊的數(shù)據(jù)發(fā)送方法 , 使本地子網(wǎng)上的所有機(jī)器都能收到相同的數(shù)據(jù) 。如果指定的套接口該選項(xiàng)已經(jīng)設(shè)置為 TRUE, 則允許套接口廣播收發(fā)信息 。 數(shù)據(jù)報(bào)類型的套接口(SOCK_DGRAM)不支持這一選項(xiàng) 。 第 8章 Winsock API 表 81 SOL_SOCKET選項(xiàng)級(jí)別下的各選項(xiàng) O p t n a m e ( 選項(xiàng)名 ) 數(shù)據(jù)類型 獲取 / 設(shè)置 說 明 S O _ A CC E P T CO N N BO O L 獲取 如為 T RU E ,表明套接口處于監(jiān)聽模式 S O _ BR O A D CA S T BO O L 獲取 / 設(shè)置 如為 T RU E ,表明套接口已 設(shè) 置 為允許 發(fā)送廣播消息 模式 S O _ CO N N E CT _ T IM E i n t 獲取 返回套接口建立連接的時(shí)間,以秒為單位 S O _ D E BU G BO O L 獲取 / 設(shè)置 如果是 T RU E ,就允許調(diào)試輸出 S O _ L IN G E R S t ru c t L i n g e r 獲取 / 設(shè)置 設(shè)置或獲取當(dāng)前的時(shí)延值 S O _ D O N T L IN G E R BO O L 獲取 / 設(shè)置 如果是 T RU E ,則禁用 S O _ L IN G E R S O _ D O N T RO U T E BO O L 獲取 / 設(shè)置 如果是 T RU E ,便直接向網(wǎng)絡(luò)接口發(fā)送消息, 無需 查詢路由表 信息 S O _ E RR O R i n t 獲取 返回并清除錯(cuò)誤狀態(tài) S O _ E X CL U S IV E A D D RU S E BO O L 獲取 / 設(shè)置 如果是 T RU E ,套接口綁定的那個(gè)本地端口就不能重新被另一個(gè)進(jìn)程使用 第 8章 Winsock API 續(xù)表 O p t n a m e ( 選項(xiàng)名 ) 數(shù)據(jù)類型 獲取 / 設(shè)置 說 明 S O _ K E E P A L IV E BO O L 獲取 / 設(shè)置 如果是 T RU E ,套接口就會(huì)進(jìn)行配置,在會(huì)話過程中發(fā)送 “ 保持活動(dòng) ” 消息 S O _ M A X _ M S G _ S IZ E 無符號(hào)整數(shù) 獲取 對(duì)一個(gè)面向消息的套接口來說,這是一條消息的最大長度 S O _ O O BIN L IN E BO O L 獲取 / 設(shè)置 如果是 T RU E ,帶外數(shù)據(jù)就會(huì)在普通數(shù)據(jù)流中 S O _ P RO T O CO L _ IN F O W S A P RO T O CO L _ IN F O 獲取 與套接口綁定的協(xié)議信息 S O _ RCV B UF i n t 獲取 / 設(shè)置 接收緩沖區(qū)長度 S O _ RE U S E A D D R BO O L 獲取 / 設(shè)置 如果是 T RU E ,套接口就可與一個(gè)正由其他套接口使用的地址綁定到一起,或與處在 T IM E _ W A IT 狀態(tài)的地址綁定到一起 S O _ R V CT IM E O i n t 獲取 / 設(shè)置 用于設(shè)置一個(gè)阻塞套接口上的接收超時(shí)值 ( 以毫秒為單位 ) S O _ S N D BU F i n t 獲取 / 設(shè)置 發(fā)送數(shù)據(jù)緩沖區(qū)長度 S O _ T Y P E i n t 獲取 返回指定套接口的類型 ( 如 S O C K _ D G RA M 和 S O CK _ S T RE A M 等 ) S O _ S N D T IM E O i n t 獲取 / 設(shè)置 獲取或設(shè)置套接口上的數(shù)據(jù)發(fā)送超時(shí)時(shí)間 ( 以毫秒為單位 ) 第 8章 Winsock API (1) ?SO_ACCEPTCONN:該選項(xiàng)只能獲取 。 后 面 要 介 紹 的 其 他 兩 種 選 項(xiàng) 級(jí) 別 (IPPROTO_IP 和IPPROTO_TCP)與 SOL_SOCKET選項(xiàng)級(jí)別的情況類似 。 對(duì)于非布爾型的其他選項(xiàng) , optval應(yīng)該指向包含所需選項(xiàng)的整型量或結(jié)構(gòu)量 , 而 optlen則為整形量或結(jié)構(gòu)量的長度 。 第 8章 Winsock API 允許一個(gè)布爾型選項(xiàng) , 則將 optval指向一個(gè)非零的整型數(shù);禁止一個(gè)布爾型選項(xiàng) , 則可以將 optval指向一個(gè)等于零的整型數(shù) 。 第 8章 Winsock API SOL_SOCKET選項(xiàng)級(jí)別 SOL_SOCKET選項(xiàng)級(jí)別主要針對(duì)傳輸層協(xié)議 (TCP或UDP)。 ● ?WSAENOTCONN:當(dāng)設(shè)置 SO_KEEPALIVE后連接被復(fù)位 。 ● ?WSAENOPROTOOPT:未知或不支持選項(xiàng) 。 ● ?WSAEINVAL: level值非法 , 或 optval中的信息非法 。 ● ?WSAEFAULT: setsockopt(?)函數(shù)返回時(shí),表示optval不是進(jìn)程地址空間中的一個(gè)有效部分; getsockopt(?)函數(shù)返回時(shí),表示 optlen參數(shù)非法。 以下是錯(cuò)誤代碼的含義說明: ● ?WSANOTINITIALISED:在使用此 API之前應(yīng)成功調(diào)用 WSAStartup(?)。 第 8章 Winsock API 3. 函數(shù)返回信息 若函數(shù)調(diào)用時(shí)無錯(cuò)誤發(fā)生 , 則 setsockopt(?)函數(shù)和getsockopt(?)函數(shù)都返回 0。 ● ?optlen:對(duì)于 setsockopt(?)函數(shù)來說 ,?它是傳入?yún)?shù);對(duì)于 getsockopt(?)函數(shù)來說 , 它既是傳出參數(shù)也是傳入?yún)?shù) 。 ● ?optval:對(duì)于 setsockopt(?)函數(shù)來說 ,?它是傳入?yún)?shù);對(duì)于 getsockopt(?)函數(shù)來說 , 它是傳出參數(shù) 。 常用的級(jí)別有 SOL_SOCKET、 IPPROTO_IP和IPPROTO_TCP, 在 ~ 選項(xiàng)進(jìn)行專門介紹 。 函數(shù)中各參數(shù)的含義如下: ● s:傳入?yún)?shù) , 參數(shù) s指定一個(gè)有效的套接口 ,我們要對(duì)這個(gè)套接口的選項(xiàng)進(jìn)行操作 。 第 8章 Winsock API 套接口選項(xiàng)設(shè)置函數(shù) setsockopt(?)的格式如下: int getsockopt( SOCKET s, int level, int optname, char FAR* optval, int FAR* optlen )。 } 程序的運(yùn)行結(jié)果如圖 81所示 。 n++) { printf(aliases: %s\n,pProtoentp_aliases[n] )。 第 8章 Winsock API for (n=0。 } //解析 protoent結(jié)構(gòu)中的信息 printf(以下信息由 getprotobyname(?)函數(shù)取得 \n)。 if (pProtoent==NULL) 第 8章 Winsock API { printf(getprotobyname(?) Error: %u\n, WSAGetLastError(?))。 } printf(\n)。, pHostenth_addr_list[n],pHostenth_length)。 pHostenth_addr_list[n]。 printf(name:%s\naliases:%s\naddrtype:%d\nlength:%d\n, pHostenth_name, pHostenth_aliases, pHostenth_addrtype, pHostenth_length)。 return 。 //根據(jù)主機(jī)名獲取主機(jī)信息 pHostent=gethostbyname(hostname)。 printf(Local host name:%s\n, hostname)。 return。 } 第 8章 Winsock API printf(\n)。wsaData)!=0) { printf(Failed to load Winsock.\n )。 struct sockaddr_in sa。 第 8章 Winsock API //主機(jī)信息指針 hostent * pHostent。 int n。 要說明的是