無阻塞套接字技術 講解 ZZ

2021-05-24 08:50:37 字數 1471 閱讀 6314

標準的網路程式設計模式有乙個缺點,就是如果 socker 類的 i/o 方法不能立即處理, i/o 方法就會阻塞 (block) 。阻塞是指程式停止執行,等待個特殊語句的完成。如當乙個程式執行到 receive 方法的時候,程式會停止執行,直到在套接字上讀到的資料為止。如果遠端裝置不傳送任何資料,程式就不能繼續下去。對於單一連線的客戶端 / 伺服器程式這種方式也許可以正常工作,但對於必須連續處理其祂事件的程式就會引起問題。有 3 個可以避免使用阻塞網路呼叫的 c# 技術:無阻塞套接字、多路傳套接字和非同步套接字。

1無阻塞套接字

有乙個簡單的防止阻塞的方法以,就是把套接字設定成非阻塞的。如:

socket sock=new socket(affressfamily.internetwork, sockettype.stream,protocoltype.tcp);

sock.blocking=false;

當套接字是非阻塞模式的時候,就不會一直等待乙個 i/o 方法的完成,就是說,如果在規定時間內該方法不能完成,程式繼續執行。比如對於 receive 方法,如果 blocking 設為 false,receive 將不等待資料出現在套接字上,而是返回乙個 0 值,表示在套接字上沒有可用的資料。

2多路傳輸套接字

另外乙個解決套接字阻塞問題的方法是使用 socket 類提供的 select 方法,這個方法用於多路傳輸多個套接字例項,以便找到乙個已經準備好進行讀或字的套接字。格式如下:

select(ilist read,ilist write ,ilist error,int microseconds)

read 、 write 、 error 都是 ilist 物件,這些物件包含要監視的套接字陣列。 microseconds 引數據指定 select 方法等待事件

時要等待多長時間以微秒為單位。用法如下:

arraylist socketlist=new arraylist(5);

socketlist.add(sock1);

socketlist.add(sock2);

socket.select(socketlist,null,null,1000);

byte   buffer=new byte[1024]

for(int i=0;i

注意: select 方法將監視 sock1 和 sock2 兩個套接字上接收的資料。即使在兩個套接字上都不有資料出理, receive 方法也不會阻礙程式的執行。

3異套接字的程式設計技術

異理套接字程式設計技術採用 asynccallback 委託為應用程式提供完成異理操作的方法。當某個網路功能結束時將轉到 asynccallback 中提供的方法來結束網駱功能。這樣就要以在等待網路操作完成自身的工作時,允許應用程式繼續處理其祂事件。

同步,非同步,阻塞套接字,非阻塞套接字

同 步指的是 傳送方不等接收方響 應,便接著 發下個資料報的通訊方式 異 步指傳送方 發出資料後,等收到接收方 發回的響應,才 發下乙個資料報的通訊方式。阻塞套接字是指執 行此套接字的網路呼叫 時,直到成功才返回,否 則一直阻塞在此網 絡呼叫上,比如呼叫 recv 函式讀 取網路緩 沖區中的資料,如...

非阻塞套接字

建立socket服務端 server socket.socket 設定非阻塞 server.setblocking false 繫結ip和埠 server.bind 6969 監聽 server.listen 5 存放連線進來的客戶端 client list accept 和recv 方法,設定非阻...

非阻塞套接字

開始之前,需要先了解一下什麼會引起程序阻塞和喚醒的事件 1 向系統請求共享資源失敗。程序在向系統請求共享資源時,由於系統已無足夠的資源分配給它,此時程序因不能繼續執行而轉變為阻塞狀態。2 等待某種操作的完成。當程序啟動某種操作後,如果該程序必須在該操作完成之後才能繼續執行,則先將該程序阻塞起來以等待...