Winsock程式設計初步之<一> Winsock程式設計原理 (轉)
本課程主要講中介面Winsock,版本為1.1。高版本的Winsock實際與1.1版相差不多,主要是進行了一些擴充,如可超越TCP/IP直接用socket來實現IPX等其它通訊協議。
這敘述方便在本文的其餘部分中提到的Winsock指的就是Winsock1.1。
透過Winsock可實現點對點或廣播通訊,實際這兩者之間的區別不大,程式設計時其程式流程所用程式碼幾乎相同,不同的地方在於目標地址選擇的不同。本課程中所舉例項為點對點的形式,並以客戶/形式來構建透過Winsock進行通訊的點對點通訊,並對通訊過程的兩點分別命名為Server和Client。
為更清楚的說明出Winsock的結構原理,下面以局的普通電話服務為比較進行說明:
1、電信局提供電話服務類似版主們這的Server,普通電話類似版主們這的Client。
2、首先電信局必須建立一個電話總機。這就如果版主們必須在Server端建立一個Socket(套接字),這一步透過socket()實現。
3、電信局必須給電話總機分配一個號碼,以便使使用者要撥找該號碼得到電話服務,同時接入該電信局的使用者必須知道該總機的號碼。同樣,版主也在Server端也要為這一套接字指定一port(埠),並且要連線該Server的Client必須知道該埠。這一步透過呼叫bind()函式實現。
4、接下來電信局必須使總機開通並使總機能夠高效地使用者撥號,如果電信局所提供服務的使用者數太多,你會發現撥打電信局總機老是忙音,通常電信局內部會使該總機對應的電話號碼連到好幾個負責的處理中心,在一個處理中心忙於處理當前的某個使用者時,新到使用者可自動轉到一下處理中心得到服務。同樣版主們的Server端也要使自己的套介面設定成監聽狀態,這是通用listen()函式實現的,listen()的第二個引數是等待佇列數,就如同你可以指定電信局的建立幾個負責交換的處理中心。
5、使用者知道了電信局的總機號後就可以進行撥打請求得到服務。在Winsock的世界裡做為Client端是要先用socket()函式建立一個套接字,然後調connect()函式進行連線。當然和電話一樣,如果等待佇列數滿了、與Server的線路不通或是Server沒有提供此項服務時,連線就不會成功。
5、電信局的總機接受了這使用者撥打的電話後負責接通使用者的線路,而總機本身則再回到等待的狀態。Server也是一樣,呼叫accept()函式進入監聽處理過程,Server端的程式碼即在中處暫停,一旦Server端接到申請後會建立一個新的套接字來對此連線做服務,而原先的套接字則再回到監聽等待的狀態。
6、當你電話掛完了,你就可以掛上電話,彼此間也就離線了。Client和Server間的套接字的關閉也是如此;這個關閉離線的動作,可由Client端或Server端勸嬤骰方先關閉。有些電話查詢系統不也是如此嗎?關閉套接字的函式為
closesocket()
從以上情況可以看出在伺服器端建立一個套接字,並進入實際的監聽步驟的過程如下:socket()->bind()->listen()->accept()
那麼在accept()完了後,版主們說在Server端將生成一個新的套接字,然後Server將繼續進入accept()狀態,版主們該如何用這個新的套接字來進行與Client端的通訊呢,這就用到了recv()函式,而Client端則是透過send()函式來向伺服器發資訊的。
在客戶端也是採取類似的過程,其呼叫Winsock的過程如下:
socket()->connect()->send()
首先建立一個socket,然後用connect()函式將其與Server端的socket連線,連線成功後呼叫send()傳送資訊。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1001890/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 玩轉 PHP 網路程式設計之原理篇PHP程式設計
- 玩轉 PHP 網路程式設計全套之 socket stream 程式設計PHP程式設計
- WinSock 重疊IO模型模型
- 併發程式設計之 CAS 的原理程式設計
- 玩轉 PHP 網路程式設計全套之多程式程式設計PHP程式設計
- Winsock2使用記錄
- 併發程式設計之顯式鎖原理程式設計
- 程式設計思想之冪等性 | 程式設計之道程式設計
- 初步瞭解C語言Windows程式設計C語言Windows程式設計
- Win10系統怎麼重置winsock win10系統重置winsock的方法Win10
- COMP9021程式設計原理程式設計
- 併發程式設計 join原理程式設計
- 【轉載】MapReduce程式設計 Intellij Idea配置MapReduce程式設計環境程式設計IntelliJIdea
- 《Python程式設計練習與解答》之程式設計概論Python程式設計
- Python併發程式設計之從效能角度來初探併發程式設計(一)Python程式設計
- Linux之shell程式設計Linux程式設計
- Spring之切面程式設計Spring程式設計
- python之超程式設計Python程式設計
- python之物件導向程式設計(一)Python物件程式設計
- Java 網路程式設計(TCP程式設計 和 UDP程式設計)Java程式設計TCPUDP
- MFC程式設計(一)C程式程式設計
- JavaScript設計模式之物件導向程式設計JavaScript設計模式物件程式設計
- 程式設計師程式設計入門一定知道!程式設計師需要學什麼?程式設計師
- 玩轉 PHP 網路程式設計全套之中斷系統程式設計PHP程式設計
- 程式設計思想 面向切面程式設計程式設計
- 01 Python3程式設計之程式設計語法簡介Python程式設計
- Shell程式設計-01-Shell指令碼初步入門程式設計指令碼
- 程式設計世界的熵增原理程式設計熵
- Dart 非同步程式設計和原理Dart非同步程式設計
- 一個老程式設計師的程式設計之路,寫給年輕的程式設計師們程式設計師
- 併發程式設計之JMM&Volatile(一)程式設計
- 半路轉行學程式設計還來得及嗎?半路轉行如何學程式設計?程式設計
- JavaScript函數語言程式設計之pointfree與宣告式程式設計JavaScript函數程式設計
- 【go網路程式設計】-HTTP程式設計Go程式設計HTTP
- 程式語言設計,程式設計哲學程式設計
- 程式設計小記-程式設計規範程式設計
- 從程式設計到養生程式設計程式設計
- 程式設計模式-表驅動程式設計程式設計設計模式
- Android之串列埠程式設計Android串列埠程式設計