1. 程式人生 > >關於Winsock:同時訪問多個傳輸協議

關於Winsock:同時訪問多個傳輸協議

必須在系統上正確安裝傳輸協議,並在Windows套接字中註冊才能訪問應用程式。 Ws2_32.dll庫匯出一組函式以方便註冊過程。 這包括建立新註冊並刪除現有註冊。

建立新註冊時,呼叫者(即堆疊供應商的安裝指令碼)提供一個或多個填充的WSAPROTOCOL_INFO結構,其中包含有關協議的完整資訊集。 有關更多資訊,請參閱Windows套接字2 SPI。 以這種方式安裝的任何傳輸堆疊稱為Windows套接字服務提供程式。

在帶有Service Pack 2(SP2)的Windows XP,帶有Service Pack 1(SP1)的Windows Server 2003和Windows Vista及更高版本上。 包含已安裝的傳輸和名稱空間提供程式列表的Winsock目錄可以使用以下命令在命令提示符中顯示:

netsh winsock顯示目錄

Microsoft Windows軟體開發工具包(SDK)包括Sporder.exe,它允許使用者檢視和修改列舉服務提供程式的順序。 使用Sporder.exe,如果存在多個此類堆疊,則使用者可以手動將特定TCP / IP協議堆疊建立為預設TCP / IP提供程式。

Sporder.exe應用程式使用Sporder.dll中的匯出函式來重新排序服務提供程式。 因此,安裝應用程式可以使用Sporder.dll提供的介面以程式設計方式重新排序服務提供程式。

  • 分層協議和協議鏈
  • 使用多個協議
  • 選擇的多個提供者限制

分層協議和協議鏈

Windows套接字2結合了分層協議的概念:一種只實現更高級別的通訊功能,同時依靠底層傳輸堆疊與遠端端點實際交換資料。 此類分層協議的一個示例是安全層,該協議將協議新增到套接字連線過程以執行身份驗證並建立加密方案。 這種安全協議通常需要諸如TCP或SPX之類的底層且可靠的傳輸協議的服務。

術語基礎協議指的是完全能夠與遠端端點執行資料通訊的協議,例如TCP或SPX。 分層協議是一種不能獨立的協議,而協議鏈是一個或多個分層協議,它們串在一起並由基本協議錨定。

如果您設計分層協議以在其上邊緣和下邊緣支援Windows Sockets 2 SPI,則可以建立協議鏈。 特殊的WSAPROTOCOL_INFO結構將協議鏈作為一個整體引用,並描述了分層協議連線的顯式順序。 這在下圖中說明。 由於應用程式只能直接使用基本協議和協議鏈,因此只有在使用WSAEnumProtocols函式列舉安裝的協議時,才會列出它們。

使用多個協議

應用程式使用WSAEnumProtocols函式來確定存在哪些傳輸協議和協議鏈,並獲取有關每個傳輸協議和協議鏈中包含的相關WSAPROTOCOL_INFO結構的資訊。

在大多數情況下,每個協議或協議鏈都有一個WSAPROTOCOL_INFO結構。 但是,某些協議表現出多種行為。 例如,SPX協議是面向訊息的(即,傳送者的訊息邊界由網路保留),但接收套接字可以忽略這些訊息邊界並將它們視為位元組流。 因此,對於每個行為,SPX-one可以存在兩個不同的WSAPROTOCOL_INFO結構條目。

在Windows套接字2中,會出現幾個新的地址系列,套接字型別和協議值。 Windows Sockets 1.1支援IPv4的單個地址系列(AF_INET),它由少量眾所周知的套接字型別和協議識別符號組成。 出於相容性原因,Windows套接字2保留現有的地址系列,套接字型別和協議識別符號,但它還支援新媒體型別的新傳輸協議的新地址族值。

新的唯一識別符號不一定是眾所周知的,但這不應該成為問題。 鼓勵需要獨立於協議的應用程式根據其適用性而不是分配給其socket_type或協議引數的值來選擇協議。 協議適用性由協議WSAPROTOCOL_INFO結構中包含的通訊屬性(如訊息與位元組流以及可靠與不可靠)指示。 選擇基於適用性的協議而不是眾所周知的協議名稱和套接字型別,使協議無關的應用程式可以利用新的傳輸協議及其相關的媒體型別。

客戶端/伺服器應用程式的伺服器一半通過在所有合適的傳輸協議上建立偵聽套接字而受益。 然後,客戶端可以使用任何合適的協議建立其連線。 例如,這將使客戶端應用程式無需修改,無論它是在通過LAN連線的桌面系統上執行還是在使用無線網路的膝上型電腦上執行。

選擇的多個提供者限制

select函式用於確定集合中一個或多個套接字的狀態。 對於每個套接字,呼叫者可以請求有關讀取,寫入或錯誤狀態的資訊。 一組套接字由FD_SET結構指示。

Windows套接字2允許應用程式使用多個服務提供程式,但select函式僅限於與單個服務提供程式關聯的一組套接字。 這絕不會限制應用程式通過多個提供程式開啟多個套接字。

有兩種方法可以確定跨越多個服務提供者的一組套接字的狀態:

  • 使用阻塞語義時使用WSAWaitForMultipleEvents或WSAEventSelect函式。
  • 使用非阻塞操作並且應用程式已在使用Windows訊息泵時使用WSAAsyncSelect函式。

當應用程式需要在跨越多個提供程式的一組套接字上使用阻塞語義時,建議使用WSAWaitForMultipleEvents。 應用程式還可以使用WSAEventSelect函式,該函式允許FD_XXX網路事件(請參閱WSAEventSelect)與事件物件關聯,並在事件物件範例內進行處理(在重疊I / O和事件物件中描述)。

WSAAsyncSelect函式不限於單個提供程式,因為它將單個套接字描述符作為輸入引數。 但請注意,WSAEventSelect函式提供了比WSAAsyncSelect更好的效能和可伸縮性,因為隨著使用的套接字總數的增加,使用Winsock事件訊息維護訊息泵的開銷也會增加。

相關推薦

關於Winsock同時訪問傳輸協議

必須在系統上正確安裝傳輸協議,並在Windows套接字中註冊才能訪問應用程式。 Ws2_32.dll庫匯出一組函式以方便註冊過程。 這包括建立新註冊並刪除現有註冊。 建立新註冊時,呼叫者(即堆疊供應商的安裝指令碼)提供一個或多個填充的WSAPROTOCOL_INFO結構,其

MATLAB函式legend的使用記錄同時函式去線標註標籤

這裡只是記錄一下legend的一個使用方法,並不是對legend函式的全面總結,全部資訊請使用MATLAB的help函式。 筆者需要在一個圖內做多條曲線(plot作圖),然後為每條曲線標註一個標籤。(具體事例參看:ESL讀書筆記2b:bias-varian

Dev-C++同時編譯檔案

Dev-C++同時編譯多個C檔案:    考察多原始碼檔案程式的編譯及標頭檔案的使用 :   如果程式的函式 分別放在不同的程式之中,那就必須是定義常量的#define指令對於每個檔案都可用:                 定義一個***.h檔案,儲存函式原型和常量定義  

jmeter工具效能測試學習筆記-2-使用者同時訪問網頁

接著上一篇的效能測試學習筆記1,發現自己當初做的辦法很蠢,於是在部落格上觀看了很多博主寫的相關資料,發現了更加簡單的方法。測試場景:1、100個使用者在5秒內同時訪問14個頁面2、新增固定計時器:每個網頁之間間隔500毫秒,即上一個網頁訪問結束後,休息500毫秒在訪問下一個網

awk -F選項同時指定符號做為分割符時遇到空格坑,題目請執行命令取出 linux 中 eth0 的 IP 地址

取出linux中eth0的ip地址 awk空格遇坑 老男孩第三關課前考試題的第三個筆試題第三關課前考試題:3.請執行命令取出 linux 中 eth0 的 IP 地址(請用 cut,有能力者也可分別用 awk,sed 命令答)因為以前有個題講過awk -F選項可以指定輸入分割符,也可以同時使用多個符號作為分割

arcgis jsapi介面入門系列(9)可以同時顯示的地圖popup

jsapi有提供popup功能,但缺點很多,例如地圖上只能同時顯示一個popup,popup內容有限制等 本文提供另一個方法,原理不用jsapi,在地圖外用一個普通的div放在地圖上面,再監聽地圖的滑鼠移動等時間控制這div跟著地圖聯動 本文程式碼可能存在跟框架的css等繫結,不一定能直接執

OpenCV練習嘗試同時提取不同的顏色物體,比如同時提取紅,藍,綠三不同顏色的物體。

python: 1.先是通過 import cv2 import numpy as np red = np.uint8([[[255,0,0]]]) hsv_red=cv2.cvtColor(red,cv2.COLOR_BGR2HSV) print hsv_red green=np.ui

Python之執行緒python執行緒設計之同時執行函式命令詳細攻略

Python之多執行緒:python多執行緒設計之同時執行多個函式命令詳細攻略 目的 同時執行多個函式命令   採取方法 T1、單個實現 import threading threading.Thread(target=my_record()).start(

EF租戶例項如何快速實現和同時支援DbContext

前言 上一篇隨筆我們談到了多租戶模式,通過多租戶模式的演化的例子。大致歸納和總結了幾種模式的表現形式。 並且順帶提到了讀寫分離。 通過好幾次的程式碼調整,使得這個庫更加通用。今天我們聊聊怎麼通過該類庫快速接入多租戶。 類庫地址: https://github.com/woailibain/kiwiho.EFc

如何同時表或列操作

lac procedure states lag nds 過濾 遊標 字符 ret 通過使用這個存儲過程,你就可以方便的對數據庫中具有一定規則的或者全部表,對這裏的字段進行各種操作,具體看示例! CREATE PROCEDURE SP_execSQLonDB (@T

Android 線程斷點續傳同時下載大文件

總結 orm acc ast mil view inpu lib 設置 最近學習在Android環境中一些網絡請求方面的知識,其中有一部分是關於網絡下載方面的知識。在這裏解析一下自己寫的demo,總結一下自己所學的知識。下圖為demo的效果圖,仿照一些應用下載商城在List

grep 同時滿足關鍵字、滿足任意關鍵字和排除關鍵字

排除 計數 not uniq 排序 word note cut 多個 1. 同時滿足多個關鍵字 grep "word1" file_name | grep "word2" | grep "word3" 2. 滿足任意關鍵字 grep -e "word1" -e "word2

github/gitlab同時管理ssh key

方便 ssh key 自己 需要 解決 -s 綁定 b- b-s 之前一直用github,但是github有一個不好的地方,要是創建私有的項目的話需要付費,而gitlab上則可以免費創建管理私有的項目。由於最近想把自己論文的一些東西整理一下,很多東西還是不方便公開,所以想用

OpenGL第二節繪制顏色四邊形

unsigned main.c 頂點 date() splay 二維 ltr width orm MyOpengGL.h://和前一節一樣。 MyUtil.h://添加 const int COLOR_MODE_CYAN = 0;//定義兩個顏色選擇const int

python爬蟲scrapy之如何同時執行scrapy爬行任務

還需 學習 lis 參數 文件名 其中 .project 自定義 com 背景:   剛開始學習scrapy爬蟲框架的時候,就在想如果我在服務器上執行一個爬蟲任務的話,還說的過去。但是我不能每個爬蟲任務就新建一個項目吧。例如我建立了一個知乎的爬行任務,但是我在這個爬行任務中

19批量檢查網站地址是否正常

font 無法 bash cto /dev/ blog null rip done 批量檢查多個網站地址是否正常 企業面試題:批量檢查多個網站地址是否正常 要求: 1、使用shell數組方法實現,檢測策略盡量模擬用戶訪問。 2、每10秒鐘做一次所有的檢測,無法訪問的輸出報

SecureCRT同時終端發送命令

view gpo net clas class pos .net window http 1、【View】->【Command Window】 2、【Send Command to】->【All Sessions】 參考: http://www.ne

問題17如何將小字符串拼接成一個大的字符串

方案 拼接 join() 生成器 優點 tle .com pan spa 功能:實現字符串拼接 方案一:叠代列表,連續使用‘+’操作依次拼接每一個字符串; r1 = [‘abc‘, ‘123‘, ‘def‘, ‘456‘, ‘hig‘, ‘789‘] s1 = ‘‘

Office 365 On MacOS 系列——配置瀏覽器賬號同時管理訂閱

Office365 O365 MacOS Chrome 雲計算 作為 O365 管理員,有時需要管理多個訂閱,特別是那些既有國際版訂閱,又有 21V 版訂閱的企業。那麽問題來了,瀏覽器在已經登錄了一個賬號的情況下,無法同時登錄另一個賬號,除非使用另一個瀏覽器。 同一個瀏覽器在已經

appium+python自動化60-windows上同時啟動appium服務,讓android機器並行運行

pre tps yam rom 啟動app 技術分享 AI 如果 aapt 前言 做android自動化的時候,啟動一個appium服務,只能匹配一個手機去自動化執行。有時候想同一套代碼,可以在不同的手機上執行,測下app在不同手機上兼容性。 這就需要啟動多個appium服