UNIX網路編程與標準開發

12.6 21.3 21.6

基本信息

原書名:Unix Network Programming, Volume 1: The Sockets Networking API (3rd Edition)
原出版社: Addison-Wesley Professional
作者:(美)W. Richard Stevens Bill Fenner Andrew M. Rudoff
叢書名: 圖靈程式設計叢書 作業系統
出版社:人民郵電出版社
ISBN:9787115228406
出版日期:2010 年6月
開本:16開
頁碼:804
版次:1-1

編輯推薦

UNIX網路專家W. Richard Stevens的傳世之作的最新版。
世界著名網路專家Bill Fenner和Andrew M. Rudoff執筆 緊跟網路技術新發展,深入探討最新關鍵標準、實現和技術 所有示例均是在UNIX系統中測試通過的真實的、可運行的代碼

內容簡介

這是一部傳世之作!頂級網路編程專家bill fenner和andrew m. rudoff應邀執筆,對w richard stevens的經典作品進行修訂。書中吸納了近幾年網路技術的發展,增添了ipv6、sctp協定和密鑰管理套接字等內容,深入討論了最新的關鍵標準、實現和技術。
書中的所有示例都是在unix系統上測試通過的真實的、可運行的代碼,繼承了stevens一直強調的理念:“學習網路編程的最好方法就是下載這些程式,對其進行修改和改進。只有這樣實際編寫代碼才能深入理解有關概念和方法。”讀者可以從圖靈網站本書網頁免費註冊下載這些示例的原始碼。
本書為UNIX網路編程提供全面的指導,是網路研究和開發人員公認的權威參考書,無論網路編程的初學者還是網路專家都會大受裨益。

目錄

第一部分 簡介和tcp/ip
第1章 簡介 2
1.1 概述 2
1.2 一個簡單的時間獲取客戶程式 5
1.3 協定無關性 9
1.4 錯誤處理:包裹函式 10
1.5 一個簡單的時間獲取伺服器程式 12
1.6 本書中客戶/伺服器程式示例索引表 14
1.7 osi模型 16
1.8 bsd網路支持歷史 17
1.9 測試用網路及主機? 19
1.10 unix標準 22
1.11 64位體系結構 24
1.12 小結? 25
習題 25
第2章 傳輸層:tcp、udp和sctp 27
2.1 概述 27
2.2 總圖 27
2.3 用戶數據報協定(udp) 29
2.4 傳輸控制協定(tcp) 30
2.5 流控制傳輸協定(sctp) 31
2.6 tcp連線的建立和終止 31
2.7 time_wait狀態 37
2.8 sctp關聯的建立和終止 38
2.9 連線埠號? 42
2.10 tcp連線埠號與並發伺服器 43
2.11 緩衝區大小及限制 45
2.12 標準網際網路服務 50
2.13 常見網際網路套用的協定使用 51
2.14 小結 52
習題 53
第二部分 基本套接字編程
第3章 套接字編程簡介 56
3.1 概述 56
3.2 套接字地址結構 56
3.3 值—結果參數 61
3.4 位元組排序函式 63
3.5 位元組操縱函式 66
3.6 inet_atoninet_addrinet_ntoa函式 67
3.7 inet_ptoninet_ntop函式 68
3.8 sock_ntop和相關函式 70
3.9 readn、writen和ReadLine函式 72
3.10 小結 76
習題 76
第4章 基本tcp套接字編程 77
4.1 概述 77
4.2 socket函式 77
4.3 connect函式 80
4.4 bind函式 81
4.5 listen函式 84
4.6 accept函式 88
4.7 fork和exec函式 90
4.8 並發伺服器 91
4.9 close函式 93
4.10 getsockname和getpeername函式 94
4.11 小結 96
習題 96
第5章 tcp客戶/伺服器程式示例 97
5.1 概述 97
5.2 tcp回射伺服器程式:main函式 97
5.3 tcp回射伺服器程式:str_echo函式 98
5.4 tcp回射客戶程式:main函式 99
5.5 tcp回射客戶程式:str_cli函式 100
5.6 正常啟動 101
5.7 正常終止 102
5.8 posix信號處理 103
5.9 處理SIGCHLD信號 106
5.10 wait和waiTPId函式 108
5.11 accept返回前連線中止 111
5.12 伺服器進程終止 112
5.13 sigpipe信號 113
5.14 伺服器主機崩潰 114
5.15 伺服器主機崩潰後重啟 115
5.16 伺服器主機關機 116
5.17 tcp程式例子小結 116
5.18 數據格式 117
5.19 小結 120
習題 120
第6章 i/o復用:select和poll函式 122
6.1 概述 122
6.2 i/o模型 122
6.3 select函式 127
6.4 str_cli函式(修訂版) 132
6.5 批量輸入 133
6.6 shutdown函式 136
6.7 str_cli函式(再修訂版) 137
6.8 tcp回射伺服器程式(修訂版) 138
6.9 pselect函式 142
6.10 poll函式 144
6.11 tcp回射伺服器程式(再修訂版) 146
6.12 小結 148
習題 149
第7章 套接字選項 150
7.1 概述 150
7.2 GETSOCKOPTsetsockopt函式 150
7.3 檢查選項是否受支持並獲取默認值 152
7.4 套接字狀態 156
7.5 通用套接字選項 156
7.6 ipv4套接字選項 168
7.7 icmpv6套接字選項 169
7.8 ipv6套接字選項 169
7.9 tcp套接字選項 171
7.10 sctp套接字選項 173
7.11 fcntl函式 182
7.12 小結 184
習題 184
第8章 基本udp套接字編程 186
8.1 概述 186
8.2 recvfrom和sendto函式 187
8.3 udp回射伺服器程式:main函式 187
8.4 udp回射伺服器程式:dg_echo函式 188
8.5 udp回射客戶程式:main函式 190
8.6 udp回射客戶程式:dg_cli函式 190
8.7 數據報的丟失 191
8.8 驗證接收到的回響 191
8.9 伺服器進程未運行 193
8.10 udp程式例子小結 194
8.11 udp的connect函式 196
8.12 dg_cli函式(修訂版) 199
8.13 udp缺乏流量控制 200
8.14 udp中的外出接口的確定 203
8.15 使用select函式的tcp和udp回射伺服器程式 204
8.16 小結 206
習題 207
第9章 基本sctp套接字編程 208
9.1 概述 208
9.2 接口模型 208
9.3 sctp_bindx函式 212
9.4 sctp_connectx函式 213
9.5 sctp_getpaddrs函式 213
9.6 sctp_freepaddrs函式 213
9.7 sctp_getladdrs函式 214
9.8 sctp_freeladdrs函式 214
9.9 sctp_sendmsg函式 214
9.10 sctp_recvmsg函式 215
9.11 sctp_opt_info函式 215
9.12 sctp_peeloff函式 216
9.13 shutdown函式 216
9.14 通知 217
9.15 小結 221
習題 222
第10章 sctp客戶/伺服器程式例子 223
10.1 概述 223
10.2 sctp一到多式流分回射伺服器程式:main函式 223
10.3 sctp一到多式流分回射客戶程式:main函式 225
10.4 sctp流分回射客戶程式:sctpstr_cli函式 226
10.5 探究頭端阻塞 228
10.6 控制流的數目 233
10.7 控制終結 233
10.8 小結 234
習題 235
第11章 名字與地址轉換 236
11.1 概述 236
11.2 域名系統 236
11.3 gethostbyname函式 239
11.4 gethostbyaddr函式 242
11.5 getservbyname和getservbyport函式 242
11.6 getaddrinfo函式 245
11.7 gai_strerror函式 250
11.8 freeaddrinfo函式 251
11.9 getaddrinfo函式:ipv6 251
11.10 getaddrinfo函式:例子 253
11.11 host_serv函式 254
11.12 tcp_connect函式 254
11.13 tcp_listen函式 257
11.14 udp_client函式 261
11.15 udp_connect函式 263
11.16 udp_server函式 264
11.17 getnameinfo函式 266
11.18 可重入函式 267
11.19 gethostbyname_r和gethostbyaddr_r函式 270
11.20 作廢的ipv6地址解析函式 271
11.21 其他網路相關信息 272
11.22 小結 273
習題 274
第三部分 高級套接字編程
第12章 ipv4與ipv6的互操作性 278
12.1 概述 278
12.2 ipv4客戶與ipv6伺服器 278
12.3 ipv6客戶與ipv4伺服器 281
12.4 ipv6地址測試宏 283
12.5 原始碼可移植性 284
12.6 小結 284
習題 285
第13章 守護進程和inetd超級伺服器 286
13.1 概述 286
13.2 syslogd守護進程 286
13.3 syslog函式 287
13.4 daemon_init函式 289
13.5 inetd守護進程 293
13.6 daemon_inetd函式 297
13.7 小結 299
習題 299
第14章 高級i/o函式 300
14.1 概述 300
14.2 套接字逾時 300
14.3 recv和send函式 305
14.4 readvwritev函式 306
14.5 recvmsg和sendmsg函式 307
14.6 輔助數據 310
14.7 排隊的數據量 313
14.8 套接字和標準i/o 313
14.9 高級輪詢技術 316
14.10 t/tcp:事務目的tcp 320
14.11 小結 322
習題 323
第15章 unix域協定 324
15.1 概述 324
15.2 unix域套接字地址結構 324
15.3 socketpair函式 326
15.4 套接字函式 327
15.5 unix域位元組流客戶/伺服器程式 327
15.6 unix域數據報客戶/伺服器程式 329
15.7 描述符傳遞 330
15.8 接收傳送者的憑證 337
15.9 小結 340
習題 340
第16章 非阻塞式i/o 341
16.1 概述 341
16.2 非阻塞讀和寫:str_cli函式(修訂版) 342
16.3 非阻塞connect 351
16.4 非阻塞connect:時間獲取客戶程式 352
16.5 非阻塞connect:web客戶程式 354
16.6 非阻塞accept 362
16.7 小結 363
習題 363
第17章 ioctl操作 365
17.1 概述 365
17.2 ioctl函式 365
17.3 套接字操作 366
17.4 檔案操作 367
17.5 接口配置 367
17.6 get_ifi_info函式 369
17.7 接口操作 378
17.8 ARP高速快取操作 378
17.9 路由表操作 380
17.10 小結 381
習題 381
第18章 路由套接字 382
18.1 概述 382
18.2 數據鏈路套接字地址結構 382
18.3 讀和寫 383
18.4 sysctl操作 390
18.5 get_ifi_info函式 394
18.6 接口名字和索引函式 397
18.7 小結 401
習題 401
第19章 密鑰管理套接字 402
19.1 概述 402
19.2 讀和寫 403
19.3 傾瀉安全關聯資料庫 404
19.4 創建靜態安全關聯 407
19.5 動態維護安全關聯 412
19.6 小結 415
習題 416
第20章 廣播 417
20.1 概述 417
20.2 廣播地址 418
20.3 單播和廣播的比較 419
20.4 使用廣播的dg_cli函式 422
20.5 競爭狀態 424
20.6 小結 431
習題 432
第21章 多播 433
21.1 概述 433
21.2 多播地址 433
21.3 區域網路上多播和廣播的比較 436
21.4 廣域網上的多播 438
21.5 源特定多播 440
21.6 多播套接字選項 441
21.7 mcast_join和相關函式 445
21.8 使用多播的dg_cli函式 450
21.9 接收ip多播基礎設施會話聲明 451
21.10 傳送和接收 454
21.11 sntp:簡單網路時間協定 457
21.12 小結 461
習題 461
第22章 高級udp套接字編程 462
22.1 概述 462
22.2 接收標誌、目的ip地址和接口索引 462
22.3 數據報截斷 467
22.4 何時用udp代替tcp 467
22.5 給udp套用增加可靠性 469
22.6 捆綁接口地址 478
22.7 並發udp伺服器 482
22.8 ipv6分組信息 483
22.9 ipv6路徑mtu控制 486
22.10 小結 487
習題 488
第23章 高級sctp套接字編程 489
23.1 概述 489
23.2 自動關閉的一到多式伺服器程式 489
23.3 部分遞送 490
23.4 通知 492
23.5 無序的數據 495
23.6 捆綁地址子集 496
23.7 確定對端和本端地址信息 497
23.8 給定ip地址找出關聯id 500
23.9 心搏和地址不可達 501
23.10 關聯剝離 502
23.11 定時控制 503
23.12 何時改用sctp代替tcp 505
23.13 小結 506
習題 506
第24章 帶外數據 507
24.1 概述 507
24.2 tcp帶外數據 507
24.3 sockatmark函式 513
24.4 tcp帶外數據小結 519
24.5 客戶/伺服器心搏函式 520
24.6 小結 524
習題 524
第25章 信號驅動式i/o 525
25.1 概述 525
25.2 套接字的信號驅動式i/o 525
25.3 使用sigio的udp回射伺服器程式 527
25.4 小結 532
習題 533
第26章 執行緒 534
26.1 概述 534
26.2 基本執行緒函式:創建和終止 535
26.3 使用執行緒的str_cli函式 537
26.4 使用執行緒的tcp回射伺服器程式 538
26.5 執行緒特定數據 542
26.6 web客戶與同時連線 549
26.7 互斥鎖 552
26.8 條件變數 555
26.9 web客戶與同時連線(續) 558
26.10 小結 560
習題 560
第27章 ip選項 561
27.1 概述 561
27.2 ipv4選項 561
27.3 ipv4源路徑選項 562
27.4 ipv6擴展首部 569
27.5 ipv6步跳選項和目的地選項 569
27.6 ipv6路由首部 573
27.7 ipv6粘附選項 577
27.8 歷史性ipv6高級api 578
27.9 小結 579
習題 579
第28章 原始套接字 580
28.1 概述 580
28.2 原始套接字創建 580
28.3 原始套接字輸出 581
28.4 原始套接字輸入 582
28.5 ping程式 584
28.6 traceroute程式 596
28.7 一個icmp訊息守護程式 608
28.8 小結 622
習題 622
第29章 數據鏈路訪問 623
29.1 概述 623
29.2 bpf:bsd分組過濾器 623
29.3 dlpi:數據鏈路提供者接口 625
29.4 linux:sock_packet和
pf_packet 626
29.5 libpcap:分組捕獲函式館 627
29.6 libnet:分組構造與輸出函式館 627
29.7 檢查udp的校驗和欄位 628
29.8 小結 645
習題 645
第30章 客戶/伺服器程式設計範式 646
30.1 概述 646
30.2 tcp客戶程式設計範式 648
30.3 TCP測試用客戶程式 649
30.4 tcp疊代伺服器程式 650
30.5 tcp並發伺服器程式,每個客戶一個子進程 650
30.6 tcp預先派生子進程伺服器程式,accept無上鎖保護 653
30.7 tcp預先派生子進程伺服器程式,accept使用檔案上鎖保護 659
30.8 tcp預先派生子進程伺服器程式,accept使用執行緒上鎖保護 662
30.9 tcp預先派生子進程伺服器程式,傳遞描述符 663
30.10 tcp並發伺服器程式,每個客戶一個執行緒 667
30.11 tcp預先創建執行緒伺服器程式,每個執行緒各自accept 669
30.12 tcp預先創建執行緒伺服器程式,主執行緒統一accept 671
30.13 小結 673
習題 674
第31章 流 675
31.1 概述 675
31.2 概貌 675
31.3 getmsg和putmsg函式 678
31.4 getpmsg和putpmsg函式 679
31.5 ioctl函式 680
31.6 tpi:傳輸提供者接口 680
31.7 小結 689
習題 689
附錄a ipv4、ipv6、icmpv4和
icmpv6 690
附錄b 虛擬網路 704
附錄c 調試技術 708
附錄d 雜湊的原始碼 714
附錄e 精選習題答案 726
參考文獻 756
索引 763

前言

概述
本書面向的讀者是那些希望自己編寫的程式能使用稱為套接字(socket)的API進行彼此通信的人。有些讀者可能已經非常熟悉套接字了,因為這個模型幾乎已經成了網路編程的同義詞,但有些讀者可能仍需要從頭開始學習。本書想達到的目標是向大家提供網路編程指導。這些內容不僅適用於專業人士,也適用於初學者;不僅適用於維護已有代碼,也適用於開發新的網路應用程式;此外,還適用於那些只是想了解一下自己系統中網路組件的工作原理的人。
書中的所有示例都是在Unix系統上測試通過的真實的、可運行的代碼。但是,考慮到許多非Unix的作業系統也支持套接字API,因而我們選取的示例與所講述的一般性概念,在很大程度上是與作業系統無關的。幾乎每種作業系統都提供了大量的網路應用程式,如網頁瀏覽器、電子郵件客戶端、檔案共享伺服器等。我們按常規的劃分方法把這些應用程式分為客戶程式和伺服器程式,並在書中多次編寫了相應的小型示例。
面向Unix介紹網路編程自然免不了要介紹Unix本身和TCP/IP的相關背景知識。需要更詳盡的背景知識時,我們會指引讀者查閱其他書籍。本書中經常提到以下4本書,我們將其簡記如下:
APUE:Advanced Programming in the UNIX Environment [Stevens 1992];
TCPv1:TCP/IP Illustrated, Volume 1 [Stevens 1994];
TCPv2:TCP/IP Illustrated, Volume 2 [Wright and Stevens 1995];
TCPv3:TCP/IP Illustrated, Volume 3 [Stevens 1996]。
其中TCPv2包含了與本書內容密切相關的細節,它描述並給出了套接字API中網路編程函式(socket、bind、connect等)的真實4.4BSD實現。如果已經理解某個特性的實現,那么在應用程式中使用該特性就更有意義了。
與第2版的區別
從20世紀80年代開始,套接字就差不多是現在這個樣子了。時至今日,套接字仍然是網路API的首選,其最初的設計的確值得稱道。因此,當讀者發現我們對出版於1998年的第2版又做了不少改動時,可能會覺得驚訝。本書中所做的改動歸納如下。
新版本包含了IPv6的最新信息。在第2版出版時,IPv6尚處於草案階段,這些年來已經有所發展。
更新了全部函式和示例的描述,以反映最新的POSIX規範(POSIX 1003.1-2001),即Single Unix Specification Version 3。
刪去了X/Open傳輸接口(XTI)的內容。這個API已經不常用了,連最新的POSIX 規範也不再提到。
刪去了事務TCP協定(T/TCP)的內容。
新增了三章用於描述一種相對較新的傳輸協定——SCTP。這個可靠的面向訊息的協定能夠在兩個端點之間提供多個流,並為多歸屬技術提供傳輸層支持。該協定最初是為了在網際網路上傳輸電話信號而設計的,但它的一些特性可以用於許多套用。
新增一章描述密鑰管理套接字,該套接字可用於網際協定安全(IPsec)和其他網路安全服務。
第2版中使用的機器及Unix變體都按最新版本更新,示例也根據機器的特性做了修改。許多情況下,修改示例是因為作業系統廠商修正了程式缺陷或者新增了特性。但讀者可以想見,新的缺陷總能不時地被發現。本書中用於測試示例的機器如下:
運行MacOS/X 10.2.6的Apple Power PC;
運行HP-UX 11i 的HP PA-RISC;
序言
本書的第1版本於1990年問世,並迅速成為程式設計師學習網路編程的權威參考書。時至今日,計算機網路技術已發生了翻天覆地的變化。只要看看第1版給出的用於徵集反饋意見的地址(“uunet!hsi!netbook”)就一目了然了。(有多少讀者能看出這是20世紀80年代很流行的UUCP撥號網路的地址?)
現在UUCP網路已經很罕見了,而無線網路等新技術則變得無處不在!在這種背景下,新的網路協定和編程范型業已開發出來,但程式設計師卻苦於找不到一本好的參考書來學習這些複雜的新技術。
這本書填補了這一空白。擁有本書舊版的讀者一定想要一個新的版本來學習新的編程方法,了解IPv6等下一代協定方面的新內容。所有人都非常期待本書,因為它完美地結合了實踐經驗、歷史視角以及在本領域浸淫多年才能獲得的透徹理解。
閱讀本書是一種享受,我收穫頗豐。相信大家定會有同感。
Sam Leffler

媒體評論

“所有人都非常期待這本書,因為它完美地結合了實踐經驗、歷史視角以及在本領域浸淫多年才能獲得的透徹理解。閱讀本書是一種享受,我收穫頗豐。相信大家定會有同感。”
——Sam Leffler,FreeBSD基金會副主席
“這部著作在計算機科學領域裡的傳奇得以延續,Bill Fenner和Andrew Rudoff居功至偉。”
——Art Sedighi
“這套書是學習網路編程最好的書。全世界最最好的,遠超群倫。”
——S. Devasundaram
——Thomas Haugland Jensen
“這本書不會讓你一夜之間成為專家,但它終究會讓你成為專家。”
——John Nguyen

相關詞條

熱門詞條

聯絡我們