?? cwsbook.txt
字號:
Windows Sockets 規范及應用
-Windows網絡編程接口
施 煒 李 錚 秦 潁 編著
***************************************************************
***
版權信息
本書作者保留所有版權。禁止任何商業性的轉載或復制。非贏利性
質的轉載和復制不得修改文章內容,并請保留此段文字。
Copyright (c) 1995-1996 By 施煒,李錚,秦穎
All Right Reserved
***************************************************************
***
內容提要
本書適應了Windows、Internet及計算機網絡普及的潮流,介紹了一套在Windows
下網絡編程的規范-Windows Sockets。這套規范是Windows下得到廣泛應用的、開
放的、支持多種協議的網絡編程接口。從1991年的1.0版到1995年的2.0.8版,經
過不斷完善并在Intel、Microsoft、Sun、SGI、Informix、Novell等公司的全力支持下,
已成為Windows網絡編程的事實上的標準。為使讀者能夠充分理解和應用這套規
范,本書不但對Windows Sockets 1.1及2.0規范作了較為詳盡的介紹,還結合了作
者的實際工作,給出了具有實際應用價值的程序實例。書中的內容包括:Windows
Sockets規范1.1版及2.0.8版介紹;Windows Sockets網絡編程指導和具體應用實例;
Windows Sockets規范1.1版及2.0.8版庫函數參考等。
本書體系完整,文字流暢,可供從事網絡應用開發的工程技術人員和大專院校
師生參考。
作者聲明
由于成書時間緊迫。本書不免有許多錯誤和不當之處,故此作者衷心希望各位
讀者能對本書提出寶貴意見(包括補充新的應用實例和內容),以便我們進一步修
改完善此書。我們會尊重相應修訂者的版權。作者也衷心希望在我們和各位讀者的
努力下,本書能夠成為一本關于Windows Sockets編程的系統而又準確的免費中文參
考書,為廣大讀者在Windows下網絡編程提供幫助。
作者聯系地址:
施煒:上海交通大學94032班 (200030)
Email: weishi@fudan.ihep.ac.cn
李錚:上海交通大學自動化系 (200030)
Email: blee.bbs@captain.net.tsinghua.edu.cn
秦穎:上海交通大學94033A班 (200030)
Email: fluke.bbs@captain.net.tsinghua.edu.cn
作者希望每一位拿到本書的讀者能以任何方式通知我們。以便我們掌握本書的
應用情況。并敬請各位讀者暫時不要在其他FTP站點散發,謝謝合作。
編著者
1996年5月20日
前言
當今世界正處于信息時代,計算機和通信網絡是這一時代所謂“信息基礎設
施”。網絡化是計算機技術九十年代的重要發展趨勢之一。目前計算機網絡的新發
展是:異機種網絡和異網互聯有較大突破。TCP/IP協議在異網互聯中體現出了其強
大的生命力,以它為基礎組建的Internet是目前國際上規模最大的計算機網間網,到
1991年底世界上已有26個國家的五千多個網絡連入Internet,其中包含了數千個組
織的30萬臺主機,用戶數以百萬計。
與計算機網絡的普及相呼應的是Windows的廣泛應用,現在在全世界各地已有
超過四千萬用戶在使用不同版本的Windows。自1995年8月24日Windows 95正式
推出以來,在短短的一個星期內銷售量已超過100萬份,有的零售商店不得不半夜
開門,以迎接滾滾而來的搶購者。這說明以用戶友好的圖形界面為基礎的Windows
已得到用戶的普遍認可,已經并將繼續成為個人機平臺上的事實上的操作系統標
準。所以研究和開發在Windows下的網絡編程技術具有普遍的應用價值。
在Windows下的各種網絡編程接口中,Windows Sockets脫穎而出,越來越得到
大家的重視,這是因為Windows Sockets規范是一套開放的、支持多種協議的
Windows下的網絡編程接口。從1991年的1.0版到1995年的2.0.8版,經過不斷完
善并在Intel、Microsoft、Sun、SGI、Informix、Novell等公司的全力支持下,已成為
Windows網絡編程的事實上的標準。
在作者利用Windows Sockets規范進行應用開發的過程中,發現這方面的資料很
少,特別是缺乏一本全面而實用的專著。為了使廣大用戶能夠充分理解和應用這套
規范,我們編寫了這本書。本書不但對Windows Sockets 1.1及2.0規范作了較為詳
盡的介紹,還結合了作者的實際工作,給出了具有實際應用價值的程序實例。希望
它能對Windows Sockets規范在國內的推廣和應用起到拋磚引玉的作用。讀者在閱讀
本書的過程中,如果能對自己的學習工作有所幫助和指導,是作者的最大愿望。由
于時間緊迫,作者學識有限,書中錯誤在所難免,偏頗和不當之處,懇請讀者不吝
賜教。
本書由施煒、李錚、秦穎合作完成,其中,第一、二、四、六章和5.2節由施
煒編寫;第七章、5.1節、3.4節由李錚編寫;第5.3節、3.1-3.3節由秦穎編寫。在
本書的編寫過程中,得到了上海交通大學的毛向輝先生的大力支持,并提供了一些
最新的資料,在此謹表示衷心的謝意。
編著者
1995年9月于上海交通大學
目錄
第一章 簡介 11
1.1 什么是WINDOWS SOCKETS規范? 11
1.2 BEKELEY套接口 12
1.3 MICROSOFT WINDOWS和針對WINDOWS的擴展 13
1.4 這份規范的地位 13
1.5 曾經作過的修改 13
1.5.1 Windows Sockets 1.0 13
1.5.2 Windows Sockets 1.1 13
第二章 使用WINDOWS SOCKETS 1.1編程 15
2.1 WINDOWS SOCKETS協議棧安裝檢查 15
2.2 套接口 15
2.2.1 基本概念 15
2.2.2 客戶機/服務器模型 16
2.2.3 帶外數據 17
2.2.4 廣播 17
2.3 字節順序 18
2.4 套接口屬性選項 18
2.5 數據庫文件 19
2.6 與BERKELEY套接口的不同 20
2.6.1 套接口數據類型和錯誤數值 20
2.6.2 select()函數和FD_*宏 20
2.6.3 錯誤代碼-errno,h_errno,WSAGetLastError() 21
2.6.4 指針 21
2.6.5 重命名的函數 22
2.6.5.1 close()和closesocket() 22
2.6.5.2 ioctl()和iooctlsocket() 22
2.6.6 阻塞例程和EINPROGRESS宏 22
2.6.7 Windows Sockets支持的最大套接口數目 22
2.6.8 頭文件 23
2.6.9 API調用失敗時的返回值 23
2.6.10 原始套接口 23
2.7 在多線程WINDOWS版本中的WINDOWS SOCKETS 24
第三章 WINDOWS SOCKETS 1.1應用實例 25
3.1 套接口網絡編程原理 25
3.2 WINDOWS SOCKETS編程原理 27
3.3 WINDOWS SOCKETS與UNIX套接口編程實例 28
3.3.1 SERVER介紹 28
3.3.2 CLIENT介紹 29
3.3.3 源程序清單 30
3.4 另一個精巧的應用程序實例-WSHOUT 37
3.4.1 源程序目錄 38
3.4.2 程序邏輯結構 38
3.4.3 源程序清單及注釋 39
3.4.3.1 wshout.c清單 39
3.4.3.2 wshout.h清單 53
3.4.3.3 wshout.rc清單 55
3.4.3.4 ushout.c清單 60
3.4.3.5 ulisten.c清單 63
3.4.3.6 tshout.c清單 66
3.4.3.7 tlisten.c清單 69
3.4.3.8 errno.c清單 73
3.4.3.9 resolve.c清單 74
第四章 WINDOWS SOCKET 1.1庫函數概覽 79
4.1 套接口函數 79
4.1.1 阻塞/非阻塞和數據易失性 80
4.2 數據庫函數 81
4.3 針對MICROSOFT WINDOWS的擴展函數 82
4.3.1 異步選擇機制 83
4.3.2 異步支持例程 83
4.3.3 阻塞鉤子函數方法 83
4.3.4 錯誤處理 84
4.3.5 通過中介DLL調用Windows Sockets DLL 84
4.3.6 Windows Sockets實現內部對消息的使用 85
4.3.7 私有的API接口 85
第五章 套接口庫函數參考 86
5.1 WINDOWS SOCKET 1.1庫函數參考 86
5.1.1 accept() 86
5.1.2 bind() 87
5.1.3 closesocket() 89
5.1.4 connect() 90
5.1.5 getpeername() 92
5.1.6 getsockname() 93
5.1.7 getsockopt() 94
5.1.8 htonl() 95
5.1.9 htons() 96
5.1.10 inet_addr() 96
5.1.11 inet_ntoa() 97
5.1.12 ioctlsocket() 98
5.1.13 listen() 99
5.1.14 ntohl() 101
5.1.15 ntohs() 101
5.1.16 recv() 102
5.1.17 recvfrom() 103
5.1.18 select() 105
5.1.19 send() 107
5.1.20 sendto() 108
5.1.21 setsockopt() 110
5.1.22 shutdown() 112
5.1.23 socket() 114
5.2 數據庫函數 115
5.2.1 gethostbyaddr() 115
5.2.2 gethostbyname() 116
5.2.3 gethostname() 117
5.2.4 getprotobyname() 118
5.2.5 getprotobynumber() 119
5.2.6 getservbyname() 120
5.2.7 getservbyport() 122
5.3 WINDOWS擴展函數 122
5.3.1 WSAAsyncGetHostByAddr() 123
5.3.2 WSAAsyncGetHostByName() 125
5.3.3 WSAAsyncGetProtoByName() 126
5.3.4 WSAAsyncGetProtoByNumber() 128
5.3.5 WSAAsyncGetServByName() 130
5.3.6 WSAAsyncGetServByPort() 132
5.3.7 WSAAsyncSelect() 134
5.3.8 WSACancelAsyncRequest() 139
5.3.9 WSACancelBlockingCall() 140
5.3.10 WSACleanup() 141
5.3.11 WSAGetLastError() 142
5.3.12 WSAIsBlocking() 143
5.3.13 WSASetBlockingHook() 143
5.3.14 WSASetLastError() 145
5.3.15 WSAStartup() 146
5.3.16 WSAUnhookBlockingHook() 150
第六章 WINDOWS SOCKET 2的擴展特性 152
6.1 同時使用多個傳輸協議 152
6.2 與WINDOWS SOCKET 1.1應用程序的向后兼容性 153
6.2.1 源碼的兼容性 153
6.2.2 二進制兼容性 153
6.3 在WINDOWS SOCKETS中注冊傳輸協議 154
6.3.1 使用多個協議 154
6.3.2 select()函數應用中關于多個服務提供者的限制 155
6.4 協議無關的名字解析 155
6.5 重疊I/O和事件對象 156
6.5.1 事件對象 156
6.5.2 接收操作完成指示 157
6.5.2.1 阻塞并且等待完成指示。 157
6.5.2.2 檢查完成指示 157
6.5.2.3 使用套接口I/O操作完成例程 157
6.5.3 WSAOVERLAPPED的細節 158
6.6 使用事件對象異步通知 159
6.7 服務的質量(QOS) 159
6.8 套接口組 160
6.9 共享套接口 160
6.10 連接建立和拆除的高級函數 161
6.11 擴展的字節順序轉換例程 162
6.12 分散/聚集方式I/O 162
6.13 協議無關的多點通訊 162
6.14 新增套接口選項一覽 163
6.15 新增套接口IOCTL操作代碼 163
6.16 新增函數一覽 164
第七章 WINDOWS SOCKETS 2擴展庫函數簡要參考 166
7.1 WSAACCEPT() 166
7.2 WSACLOSEEVENT() 167
7.3 WSACONNECT() 167
7.4 WSACREATEEVENT() 169
7.5 WSADUPLICATESOCKET() 170
7.6 WSAENUMNETWORKEVENTS() 171
7.7 WSAENUMPROTOCOLS() 171
7.8 WSAEVENTSELECT() 172
7.9 WSAGETOVERLAPPEDRESULT() 174
7.10 WSAGETQOSBYNAME() 175
7.11 WSAHTONL() 175
7.12 WSAHTONS() 176
7.13 WSAIOCTL() 176
7.14 WSAJOINLEAF() 177
7.15 WSANTOHL() 179
7.16 WSANTOHS() 179
7.17 WSARECV() 180
7.18 WSARECVDISCONNECT() 181
7.19 WSARECVFROM() 182
7.20 WSARESETEVENT() 184
7.21 WSASEND() 184
7.22 WSASENDDISCONNECT() 186
7.23 WSASENDTO() 186
7.24 WSASETEVENT() 188
7.25 WSASOCKET() 189
7.26 WSAWAITFORMULTIPLEEVENTS() 190
附錄A 錯誤代碼 192
附錄B WINDOWS SOCKETS頭文件 196
附錄B.1 WINDOWS SOCKETS 1.1頭文件 196
附錄B.2 WINDOWS SOCKETS 2頭文件 217
附錄B.3 WINSOCK.DEF文件 252
附錄C 參考文獻 255
第一章 簡介
1.1 什么是Windows Sockets規范?
Windows Sockets規范以U.C. Berkeley大學BSD UNIX中流行的Socket接口為范
例定義了一套Micosoft Windows下網絡編程接口。它不僅包含了人們所熟悉的
Berkeley Socket風格的庫函數;也包含了一組針對Windows的擴展庫函數,以使程
序員能充分地利用Windows消息驅動機制進行編程。
Windows Sockets規范本意在于提供給應用程序開發者一套簡單的API,并讓各
家網絡軟件供應商共同遵守。此外,在一個特定版本Windows的基礎上,Windows
Sockets也定義了一個二進制接口(ABI),以此來保證應用Windows Sockets API的
應用程序能夠在任何網絡軟件供應商的符合Windows Sockets協議的實現上工作。因
此這份規范定義了應用程序開發者能夠使用,并且網絡軟件供應商能夠實現的一套
庫函數調用和相關語義。
遵守這套Windows Sockets規范的網絡軟件,我們稱之為Windows Sockets兼容
的,而Windows Sockets兼容實現的提供者,我們稱之為Windows Sockets提供者。
一個網絡軟件供應商必須百分之百地實現Windows Sockets規范才能做到現
Windows Sockets兼容。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -