Windows Socket1 1 程式設計

2022-10-09 22:51:15 字數 4339 閱讀 7122

[文章導讀]windows sockets 是從 berkeley sockets 擴充套件而來的,其在繼承 berkeley sockets 的基礎上,又進行了新的擴充

一、簡介

windows sockets 是從 berkeley sockets 擴充套件而來的,其在繼承 berkeley sockets 的基礎上,又進行了新的擴充。這些擴充主要是提供了一些非同步函式,並增加了符合windows訊息驅動特性的網路事件非同步選擇機制。

windows sockets由兩部分組成:開發元件和執行元件。

開發元件:windows sockets 實現文件、應用程式介面(api)引入庫和一些標頭檔案。

執行元件:windows sockets 應用程式介面的動態鏈結庫(winsock.dll)。

二、主要擴充說明

1、非同步選擇機制:

windows sockets 的非同步選擇函式提供了訊息機制的網路事件選擇,當使用它登記網路事件發生時,應用程式相應視窗函式將收到乙個訊息,訊息中指示了發生的網路事件,以及與事件相關的一些資訊。

windows sockets 提供了乙個非同步選擇函式 wsaasyncselect(),用它來註冊應用程式感興趣的網路事件,當這些事件發生時,應用程式相應的視窗函式將收到乙個訊息。

函式結構如下:

int pascal far wsaasyncselect(socket s,hwnd hwnd,unsigned int wmsg,long levent);

引數說明:

hwnd:視窗控制代碼

wmsg:需要傳送的訊息

levent:事件(以下為事件的內容)

值:含義:

fd_read

期望在套接字上收到資料(即讀準備好)時接到通知

fd_write

期望在套接字上可傳送資料(即寫準備好)時接到通知

fd_oob

期望在套接字上有帶外資料到達時接到通知

fd_accept

期望在套接字上有外來連線時接到通知

fd_connect

期望在套接字連線建立完成時接到通知

fd_close

期望在套接字關閉時接到通知

例如:我們要在套接字讀準備好或寫準備好時接到通知,語句如下:

rc=wsaasyncselect(s,hwnd,wmsg,fd_read|fd_write);

如果我們需要登出對套接字網路事件的訊息傳送,只要將 levent 設定為0

2、非同步請求函式

在 berkeley sockets 中請求服務是阻塞的,windows sickets 除了支援這一類函式外,還增加了相應的非同步請求函式(wsaasyncgetxbyy();)。

3、阻塞處理方法

windows sockets 為了實現當乙個應用程式的套接字呼叫處於阻塞時,能夠放棄cpu讓其它應用程式執行,它在呼叫處於阻塞時便進入乙個叫「hook」的例程,此例程負責接收和分配windows訊息,使得其它應用程式仍然能夠接收到自己的訊息並取得控制權。

windows 是非搶先的多工環境,即若乙個程式不主動放棄其控制權,別的程式就不能執行。因此在設計windows sockets 程式時,儘管系統支援阻塞操作,但還是反對程式設計師使用該操作。但由於 sun 公司下的 berkeley sockets 的套接字預設操作是阻塞的,windows 作為移植的 sockets 也不可避免對這個操作支援。

在windows sockets 實現中,對於不能立即完成的阻塞操作做如下處理:dll初始化→迴圈操作。在迴圈中,它傳送任何 windows 訊息,並檢查這個 windows sockets 呼叫是否完成,在必要時,它可以放棄cpu讓其它應用程式執行(當然使用超執行緒的cpu就不會有這個麻煩了^_^)。我們可以呼叫 wsacancelblockingcall() 函式取消此阻塞操作。

在 windows sockets 中,有乙個預設的阻塞處理例程 blockinghook() 簡單地獲取並傳送 windows 訊息。如果要對複雜程式進行處理,windows sockets 中還有 wsasetblockinghook() 提供使用者安裝自己的阻塞處理例程能力;與該函式相對應的則是 swaunhookblockinghook(),它用於刪除先前安裝的任何阻塞處理例程,並重新安裝預設的處理例程。請注意,設計自己的阻塞處理例程時,除了函式 wsacancelblockinghook() 之外,它不能使用其它的 windows sockets api 函式。在處理例程中呼叫 wsacancelblockinghook()函式將取消處於阻塞的操作,它將結束阻塞迴圈。

4、出錯處理

windows sockets 為了和以後多執行緒環境(windows/unix)相容,它提供了兩個出錯處理函式來獲取和設定當前執行緒的最近錯誤號。(wsagetlasteror()和wsasetlasterror())

5、啟動與終止

使用函式 wsastartup() 和 wsacleanup() 啟動和終止套接字。

三、windows sockets網路程式設計核心

我們終於可以開始真正的 windows sockets 網路程式設計了。不過我們還是先看一看每個 windows sockets 網路程式都要涉及的內容。讓我們一步步慢慢走。

1、啟動與終止

在所有 windows sockets 函式中,只有啟動函式 wsastartup() 和終止函式 wsacleanup() 是必須使用的。

啟動函式必須是第乙個使用的函式,而且它允許指定 windows sockets api 的版本,並獲得 sockets的特定的一些技術細節。本結構如下:

int pascal far wsastartup(word wversionrequested, lpwsadata lpwsadata);

其中 wversionrequested 保證 sockets 可正常執行的 dll 版本,如果不支援,則返回錯誤資訊。

我們看一下下面這段**,看一下如何進行 wsastartup() 的呼叫

word wversionrequested;// 定義版本資訊變數

wsadata wsadata;//定義資料資訊變數

int err;//定義錯誤號變數

wversionrequested = makeword(1,1);//給版本資訊賦值

err = wsastartup(wversionrequested, &wsadata);//給錯誤資訊賦值

if(err!=0)

//確認 windows sockets dll 支援 1.1 版本

//dll 版本可以高於 1.1

//系統返回的版本號始終是最低要求的 1.1,即應用程式與dll 中可支援的最低版本號

if(lobyte(wsadata.wversion)!= 1|| hibyte(wsadata.wversion)!=1)

//windows sockets dll 被程序接受,可以進入下一步操作

關閉函式使用時,任何開啟並已連線的 sock_stream 套接字被復位,但那些已由 closesocket() 函式關閉的但仍有未傳送資料的套接字不受影響,未傳送的資料仍將被傳送。程式執行時可能會多次呼叫 wsastartuo() 函式,但必須保證每次呼叫時的 wversionrequested 的值是相同的。

2、非同步請求服務

windows sockets 除支援 berkeley sockets 中同步請求,還增加了了一類非同步請求服務函式 wsaasyncgerxbyy()。該函式是阻塞請求函式的非同步版本。應用程式呼叫它時,由 windows sockets dll 初始化這一操作並返**用者,此函式返回乙個非同步控制代碼,用來標識這個操作。當結果儲存在呼叫者提供的緩衝區,並且傳送乙個訊息到應用程式相應視窗。常用結構如下:

handle taskhnd;

char hostname="rs6000";

taskhnd = wsaasyncbethostbyname(hwnd,wmsg,hostname,buf,buflen);

需要注意的是,由於 windows 的記憶體對像可以設定為可移動和可丟棄,因此在操作記憶體物件是,必須保證 wiindows sockets dll 物件是可用的。

3、非同步資料傳輸

使用 send() 或 sendto() 函式來傳送資料,使用 recv() 或recvfrom() 來接收資料。windows sockets 不鼓勵使用者使用阻塞方式傳輸資料,因為那樣可能會阻塞整個 windows 環境。下面我們看乙個非同步資料傳輸例項:

假設套接字 s 在連線建立後,已經使用了函式 wsaasyncselect() 在其上註冊了網路事件 fd_read 和 fd_write,並且 wmsg 值為 um_sock,那麼我們可以在 windows 訊息迴圈中增加如下的分支語句:

case um_sock:

switch(lparam)

break;

4、出錯處理

Windows Socket1 1 程式設計

一 簡介 windows sockets 是從 berkeley sockets 擴充套件而來的,其在繼承 berkeley sockets 的基礎上,又進行了新的擴充。這些擴充主要是提供了一些非同步函式,並增加了符合windows訊息驅動特性的網路事件非同步選擇機制。windows sockets...

Windows Socket 程式設計

伺服器端 客戶端 在 http fayaa.com code 處理的高亮顯示效果 c 語言 臨時自用 include include void main if lobyte wsadata wversion 1 hibyte wsadata wversion 1 socket socksrv soc...

Windows Socket程式設計

windows下socket程式設計主要包括以下幾部分 服務端1 初始化windows socket庫。2 建立socket。3 繫結socket。4 監聽。5 accept。6 接收 傳送資料。客戶端1 初始化windows socket庫。2 建立socket。3 連線socket。4 接收 傳...