【正文】
ncGetServByName(?)函數(shù)用于返回對(duì)應(yīng)于給定服務(wù)名和協(xié)議名的相關(guān)服務(wù)信息 。 char FAR* FAR* s_aliases。 char FAR * s_proto。 第 8章 Winsock API 該結(jié)構(gòu)中各成員的含義如下: ● ?s_name:正規(guī)的服務(wù)名 。 ● ?s_port:連接該服務(wù)時(shí)需要用到的端口號(hào) , 返回的端口號(hào)是以網(wǎng)絡(luò)字節(jié)順序排列的 。 第 8章 Winsock API 1. 函數(shù)格式 在 Winsock 1中提供的 getservbyname(?)函數(shù)的格式是: struct servent FAR *getservbyname( const char FAR* name, const char FAR* proto )。 第 8章 Winsock API 2. 函數(shù)參數(shù)說明 這兩個(gè)函數(shù)中各參數(shù)的說明如下: ● ?name:傳入?yún)?shù) , 一個(gè)指向服務(wù)名的指針 。如果這個(gè)指針為空 , getservbyname(?)返回第一個(gè) name與 s_name或者某一個(gè) s_aliases匹配的服務(wù)條目 。 其他參數(shù)與 WSAAsyncGetHostByName(?)函數(shù)中的參數(shù)含義相同。 1. 函數(shù)格式 在 Winsock 1中提供的 getservbyport(?)函數(shù)的格式是: struct servent FAR *getservbyport( int port, const char FAR *proto )。 第 8章 Winsock API 2. 函數(shù)參數(shù)說明 這兩個(gè)函數(shù)中需要說明的參數(shù)如下: ● ?port:傳入?yún)?shù) , 給定的端口號(hào) , 以網(wǎng)絡(luò)字節(jié)順序排列 。如果這個(gè)指針為空 , getservbyport(?)返回第一個(gè) port與s_port匹配的服務(wù)條目 。 其他參數(shù)與 WSAAsyncGetHostByName(?)函數(shù)中的參數(shù)含義相同 。 本實(shí)例只使用了三個(gè)比較典型的函數(shù) , 其他函數(shù)的用法與此類似 。 第 8章 Winsock API /************************************************************************* 調(diào)試環(huán)境: VC++ 程序名稱: 程序功能:該程序使用網(wǎng)絡(luò)信息獲取函數(shù)取得主機(jī)的有關(guān)信息 ,在程序中使用了以下三個(gè)函數(shù) : gethostname(?) gethostbyname(?) getprotobyname(?) 命令格式: host **************************************************************************/ 第 8章 Winsock API include include include void main(?) { WSADATA wsaData。 //存放主機(jī)名稱 char hostname[256]。 //主機(jī)協(xié)議信息指針 protoent * pProtoent。 if(WSAStartup(MAKEWORD(2,2),amp。 return。 //獲得主機(jī)名 if(gethostname(hostname, sizeof(hostname))!= 0) { printf(gethostname(?) Error: %u\n, WSAGetLastError(?))。 } 第 8章 Winsock API printf(以下信息由 gethostname(?)函數(shù)取得 \n)。 printf(\n)。 if (pHostent==NULL) { printf(gethostbyname(?) Error: %u\n, WSAGetLastError(?))。 } 第 8章 Winsock API //解析返回的 hostent結(jié)構(gòu)中名稱 、 別名 、 地址類型和地址長(zhǎng)度信息 printf(以下信息由 gethostbyname(?)函數(shù)取得 \n)。 第 8章 Winsock API //解析 hostent結(jié)構(gòu)中的主機(jī)地址 for (n=0。 n++) { memcpy(amp。 //輸出主機(jī) IP地址 . printf(Address: %s\n, i_ntoa())。 //根據(jù)協(xié)議名獲得協(xié)議信息 pProtoent=getprotobyname(tcp)。 return 。 printf(name:%s\nproto:%d\n, pProtoentp_name, pProtoentp_proto)。 pProtoentp_aliases[n]。 } WSACleanup(?)。 第 8章 Winsock API 圖 81 網(wǎng)絡(luò)信息獲取函數(shù)使用實(shí)例程序的運(yùn)行結(jié)果 第 8章 Winsock API 套接口選項(xiàng)函數(shù) 套接口選項(xiàng)函數(shù)說明 1. 函數(shù)格式 套接口選項(xiàng)獲取函數(shù) getsockopt(?)的格式如下: int setsockopt( SOCKET s, int level, int optname, const char FAR* optval, int optlen )。 第 8章 Winsock API 2. 函數(shù)參數(shù)說明 setsockopt(?)函數(shù)和 getsockopt(?)函數(shù)的參數(shù)是一樣的 , 但 setsockopt(?)函數(shù)的 optval和 optlen選項(xiàng)應(yīng)該由應(yīng)用程序填寫 , 而 getsockopt(?)函數(shù)的這兩個(gè)選項(xiàng)是返回值 , 由系統(tǒng)來填寫 。 ● ?level:傳入?yún)?shù) , 套接口選項(xiàng)定義的級(jí)別 (層次 )。 第 8章 Winsock API ● ?optname:傳入?yún)?shù) , 需設(shè)置或獲取的套接口選項(xiàng) , 這些選項(xiàng)的名稱均是在 Winsock頭文件內(nèi)定義的常數(shù)值 。 該參數(shù)是指向存放選項(xiàng)值緩沖區(qū)的指針 。 該參數(shù)是指向 optval緩沖區(qū)長(zhǎng)度 (或套接口選項(xiàng)變量的長(zhǎng)度 )的指針 。 如果調(diào)用發(fā)生錯(cuò)誤 , 則返回SOCKET_ERROR 錯(cuò)誤信息 , 應(yīng)用程序可通過WSAGetLastError(?)函數(shù)獲取對(duì)錯(cuò)誤信息的進(jìn)一步說明 。 ● ?WSAENETDOWN: Windows套接口實(shí)現(xiàn)已檢測(cè)到網(wǎng)絡(luò)子系統(tǒng)失效 。 第 8章 Winsock API ● ?WSAEINPROGRESS:一個(gè)阻塞的 Windows套接口調(diào)用正在運(yùn)行中 。 ● ?WSAENETRESET:當(dāng) SO_KEEPALIVE設(shè)置后連接超時(shí) 。 其中 ,SOCK_STREAM類型的套接口不支持 SO_BROADCAST選項(xiàng) ,SOCK_DGRAM 類型的套接口不支持 SO_DONTLINGER 、SO_KEEPALIVE、 SO_LINGER和 SO_OOBINLINE選項(xiàng) 。 ● ?WSAENOTSOCK:描述字不是一個(gè)套接口 。 在 SOL_SOCKET選項(xiàng)級(jí)別下 , 套接口的選項(xiàng)有兩種類型:一種是值為布爾型 (BOOL)的選項(xiàng) , 這種選項(xiàng)可以允許或禁止一種特性;另一種是值為整型 (int)或結(jié)構(gòu)型 (Struct Linger)的選項(xiàng) , 這種選項(xiàng)可以用來設(shè)置系統(tǒng)工作時(shí)的某些參數(shù) 。 對(duì)于布爾型選項(xiàng) , optlen應(yīng)等于 sizeof(int)。 還要注意一個(gè)問題 , 套接口的有些屬性值既可以設(shè)置 (即可以使用 setsockopt(?)函數(shù) ), 也可以獲取 (即使用 getsockopt(?)函數(shù) ), 但有些套接口屬性只能獲取或只能設(shè)置 。 表 81所示為在 SOL_SOCKET選項(xiàng)級(jí)別下的各種選項(xiàng) 。 如果已通過 listen(?)函數(shù)調(diào)用 ,??套接口將進(jìn)入監(jiān)聽模式 , 這時(shí)獲取這個(gè)選項(xiàng)時(shí)就會(huì)返回 TRUE。 (2) ?SO_BROADCAST:??該選項(xiàng)可以獲取也可以設(shè)置 。 該選項(xiàng)只有對(duì)非 SOCK_STREAM類型的所有套接口才是有效的 。 廣播通信的缺點(diǎn)在于假如同時(shí)有許多進(jìn)程發(fā)送廣播數(shù)據(jù) , 網(wǎng)絡(luò)立刻就會(huì)擁擠不堪 , 造成網(wǎng)絡(luò)性能大大降低 , 甚至有可能陷入癱瘓 。 該選項(xiàng)的設(shè)置方法如下: 第 8章 Winsock API …… BOOL bBroadcast=TRUE。 …… //設(shè)置廣播選項(xiàng) if(setsocketopt(s,SOL_SOCKET,SO_BROADCAST,(char*)amp。39。39。 return。 它是一個(gè)微軟 Windows操作系統(tǒng)專用選項(xiàng) , 用于返回連接建立的時(shí)間 , 以秒為單位 。若套接口當(dāng)前尚未建立連接 , 返回值便是 0xFFFFFFFF。在應(yīng)用程序設(shè)置了 SO_DEBUG選項(xiàng)的情況下 , 系統(tǒng)將記錄調(diào)試信息 。 要想打開調(diào)試信息 , 可調(diào)用 setsockopt(?)函數(shù)設(shè)置 SO_DEBUG為 TRUE。 但目前尚無任何一種 Win32平臺(tái)支持的 SO_DEBUG選項(xiàng) 。 該選項(xiàng)不能使用在 SOCK_DGRAM類型的套接口上 。 該選項(xiàng)要通過 linger結(jié)構(gòu)來設(shè)置 , 該結(jié)構(gòu)的定義如下: struct linger{ int l_onoff。 }。 l_linger字段表示延遲時(shí)間 , 以秒為單位 。 第 8章 Winsock API 表 82 SO_LINGER選項(xiàng)取值情況說明 l _ o n o ff l _ l i n g e r S O _ L IN G E R 說 明 ≠ 0 ≠ 0 設(shè)置 這種取值意味著當(dāng)調(diào)用 c l o s e s o c k e t ( ) 函數(shù)關(guān)閉一個(gè)套接口時(shí),進(jìn)程將進(jìn)入睡眠狀態(tài) ( 即被阻塞 ) ,直到所剩數(shù)據(jù)發(fā)送完畢或超出規(guī)定的時(shí)間 ( 超時(shí)時(shí)間由 l _ l i n g e r 設(shè)定 ) ,這種關(guān)閉稱為“優(yōu)雅”的關(guān)閉,因?yàn)樗粫?huì)造成數(shù)據(jù)的丟失。因?yàn)樘捉涌诘奶撾娐妨⒓幢粡?fù)位 ( 發(fā)送一個(gè) RS T 給對(duì)方 ) ,且丟失了未發(fā)送的所有數(shù)據(jù),此時(shí)在遠(yuǎn)端的 re c v ( ) 調(diào)用將以W S A E CO N N RE S E T 出錯(cuò) =0 — 關(guān)閉 系統(tǒng)執(zhí)行默認(rèn)的操作, l _ l i n g e r 參數(shù)將被忽略, c l o s e s o c k e t ( ) 將立即返回 第 8章 Winsock API (6) ?SO_DONTLINGER:該選項(xiàng)值可以獲取,也可以設(shè)置。 SO_DONTLINGER和SO_LINGER選項(xiàng)將直接影響使用 closesocket(?)函數(shù)關(guān)閉一個(gè)套接口時(shí)系統(tǒng)對(duì)套接口的操作行為。 第 8章 Winsock API 表 83 SO_DONTLINGER和 SO_LINGER選項(xiàng) 對(duì)套接口關(guān)閉方式的影響 選 項(xiàng) 間隔時(shí)間 套接口關(guān)閉方式 套接口在關(guān)閉前是否等待 S O _ D O N T L IN G E R 不關(guān)心 優(yōu)雅 否 S O _ L IN G E R 0 強(qiáng)制 否 S O _ L IN G E R ≠ 0 優(yōu)雅 是 第 8章 Winsock API (7) ?SO_DONTROUTE:該選項(xiàng)可以獲取,也可以設(shè)置。 (9) ?SO_KEEPALIVE:該選項(xiàng)可以獲取,也可以設(shè)置,它只適用于以 TCP為基礎(chǔ)的套接口。 (10) ?SO_MAX_MSG_SIZE:該選項(xiàng)只能獲取。 第 8章 Winsock API (12) ?SO_PROTOCOL_INFO:該選項(xiàng)只能獲取 , 獲取WSAPROTCOL_INFO結(jié)構(gòu)中與套接口關(guān)聯(lián)在一起的協(xié)議特征信息 。 (13) ?SO_RCVBUF:該選項(xiàng)可以獲取,也可以設(shè)置。 與SO_RCVBUF選項(xiàng)相對(duì)應(yīng) , 該選項(xiàng)用于確定發(fā)送緩沖區(qū)的大小 。 可能的套接口類型包括 SOCK_DGRAM 、SOCK_STREAM和 SOCK_RAW。 第 8章 Winsock API (17) ?SO_RCVTIMEO:該選項(xiàng)可以獲取,也可以設(shè)置。 (19) ?SO_EXCLUSIVEADDRUSE:該選項(xiàng)可以獲取,也可以