程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> WINDOWS SOCKETS 1.1 程序設計

WINDOWS SOCKETS 1.1 程序設計

編輯:關於C語言

 

一、簡介
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 版本,如果不支持,則返回錯誤信息。
我們看一下下面這段代碼,看一下如何進

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved