Winsock程式設計初步之<一> Winsock程式設計原理 (轉)

gugu99發表於2008-04-04
Winsock程式設計初步之 Winsock程式設計原理 (轉)[@more@]

  本課程主要講中介面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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章