- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
簡單的 Winsock 應用程式設計(1)
林 軍 鼐
相信各位讀者現在對於 Winsock 的定義、系統環境,以及一些 Winsock Stack及 Winsock 應用程式,都有基本的認識了。接下來筆者希望能分幾期為各位讀者介紹一下簡單的 Winsock 網路應用程式設計。
我們將以 Winsock 1.1 規格所定義的 46 個應用程式介面(API)為基礎,逐步來建立一對 TCP socket 主從架構(Client / Server)的程式。在這兩個程式中,Server 將使用 Winsock 提供的「非同步」(asynchronous)函式來建立 socket 連結、關閉、及資料收送等等;而 Client 則採類似傳統 UNIX 的「阻攔式」(blocking)。由於我們的重點並不在於 MS Windows SDK 的程式設計,所以我們將使用最簡便的方式來顯示訊息;有關 MS Windows 程式的技巧,請各位讀者自行研究相關的書籍及文章。
今天我們先要看一下主從架構 TCP socket 的建立連結(connect)及關閉(close)。(參見圖 1.)
(圖 1. 主從架構的 TCP socket 連接建立與關閉)
以前筆者曾簡單地介紹過主從架構的概念,現在我們再以生活上更淺顯的例子來說明一下,讀者稍後也較容易能明白筆者的敘述。我們可以假設 Server 就像是電信局所提供的一些服務,比如「104 查號台」或「112 障礙台」。
(1)電信局先建立好了一個電話總機,這就像是呼叫 socket() 函式開啟了一個 socket。(2)接著電信局將這個總機的號碼定為 104,就如同我們呼叫 bind() 函式,將 Server 的這個 socket 指定(bind)在某一個 port。當然電信局必須讓用戶知道這個號碼;而我們的 Client 程式同樣也要知道 Server 所用的 port,待會才有辦法與之連接。(3)電信局的 104 查號台底下會有一些自動服務的分機,但是它的數量是有限的,所以有時你會撥不通這個號碼(忙線)。同樣地,我們在建立一個 TCP 的Server socket 時,也會呼叫 listen() 函式來監聽等待;listen() 的第二個參數即是waiting queue 的數目,通常數值是由 1 到 5。(事實上這兩者還是有點不一樣。)(4)用戶知道了電信局的這個 104 查號服務,他就可以利用某個電話來撥號連接這個服務了。這就是我們 Client 程式開啟一個相同的 TCP socket,然後呼叫connect() 函式去連接 Server 指定的那個 port。當然了,和電話一樣,如果 waitingqueue 滿了、與 Server 間線路不通、或是 Server 沒提供此項服務時,你的連接就會失敗。(5)電信局查號台的總機接受了這通查詢的電話後,它會轉到另一個分機做服務,而總機本身則再回到等待的狀態。Server 的 listening socket 亦是一樣,當你呼叫了 accept() 函式之後,Server 端的系統會建立一個新的 socket 來對此連接做服務,而原先的 socket 則再回到監聽等待的狀態。(6)當你查詢完畢了,你就可以掛上電話,彼此間也就離線了。Client 和Server 間的 socket 關閉亦是如此;不過這個關閉離線的動作,可由 Client 端或Server 端任一方先關閉。有些電話查詢系統不也是如此嗎?
接下來,我們就來看主從架構的 TCP socket 是如何利用這些 Winsock 函式來達成的;並利用資策會資訊技術處的「WinKing」這個 Winsock Stack 中某項功能來顯示 sockets 狀態的變化。文章中僅列出程式的片段,完整的程式請看附錄的程式。
【Server 端建立 socket 並進入監聽等待狀態】
首先我們先看 Server 端如何建立一個 TCP socket,並使其進入監聽等待的狀態。
在圖 1. 上,我們可以看到最先被呼叫到的是 WSAStartup() 函式。說明如下:
WSAStartup():連結應用程式與 Winsock.DLL 的第一個函式。格 式: int PASCAL FAR WSAStartup( WORD wVersionRequested,LPWSADATA lpWSAData );參 數: wVersionRequested 欲使用的 Windows Sockets API 版本lpWSAData 指向 WSADATA 資料的指標傳回值: 成功 - 0失敗 - WSASYSNOTREADY / WSA
您可能关注的文档
最近下载
- 《往复式压缩机培训》PPT课件.pptx VIP
- Unit4PlantsaroundusPartLet'slearn(教学设计)-人教PEP版(级上册.docx
- JJF(陕) 060-2021 倒角卡尺校准规范.docx VIP
- 国家开放大学最新《电工电子技术》形考任务(1-6)试题及答案解析.docx VIP
- 人工神经网络课后习题及参考答案.docx VIP
- 贵州大学工程数学期末考试试题.doc VIP
- JJF(陕) 104-2023 裂隙灯显微镜校准规范.docx VIP
- 生物材料学课件.pptx VIP
- DB45∕T 1551-2017 高等级公路水泥混凝土路面设计规范.docx
- JJF(京) 127-2024 零气发生器校准规范.docx VIP
原创力文档


文档评论(0)