共用方式為


Socket.Select 方法

定義

多載

名稱 Description
Select(IList, IList, IList, TimeSpan)

決定一或多個套接字的狀態。

Select(IList, IList, IList, Int32)

決定一或多個套接字的狀態。

Select(IList, IList, IList, TimeSpan)

來源:
Socket.cs
來源:
Socket.cs
來源:
Socket.cs
來源:
Socket.cs
來源:
Socket.cs

決定一或多個套接字的狀態。

public:
 static void Select(System::Collections::IList ^ checkRead, System::Collections::IList ^ checkWrite, System::Collections::IList ^ checkError, TimeSpan timeout);
public static void Select(System.Collections.IList? checkRead, System.Collections.IList? checkWrite, System.Collections.IList? checkError, TimeSpan timeout);
static member Select : System.Collections.IList * System.Collections.IList * System.Collections.IList * TimeSpan -> unit
Public Shared Sub Select (checkRead As IList, checkWrite As IList, checkError As IList, timeout As TimeSpan)

參數

checkRead
IList

IList Socket以下是檢查可讀性的例子。

checkWrite
IList

IList Socket以下是檢查可寫性的情況。

checkError
IList

IList有幾個Socket例子可以用來檢查錯誤。

timeout
TimeSpan

逾時值。 等於 -1 微秒的值表示無限長的逾時。

例外狀況

這些 checkRead、 、 和 checkError 參數皆為全nullcheckWrite或為空。 至少有一個 checkReadcheckWritecheckError 必須包含至少一個 Socket

checkRead參數 、 checkWritecheckError 或 包含過多套接字。

timeout時間不到 -1 微秒,或大於MaxValue微秒

嘗試存取套接字時發生錯誤。

已處置一或多個套接字。

適用於

Select(IList, IList, IList, Int32)

來源:
Socket.cs
來源:
Socket.cs
來源:
Socket.cs
來源:
Socket.cs
來源:
Socket.cs

決定一或多個套接字的狀態。

public:
 static void Select(System::Collections::IList ^ checkRead, System::Collections::IList ^ checkWrite, System::Collections::IList ^ checkError, int microSeconds);
public static void Select(System.Collections.IList? checkRead, System.Collections.IList? checkWrite, System.Collections.IList? checkError, int microSeconds);
public static void Select(System.Collections.IList checkRead, System.Collections.IList checkWrite, System.Collections.IList checkError, int microSeconds);
static member Select : System.Collections.IList * System.Collections.IList * System.Collections.IList * int -> unit
Public Shared Sub Select (checkRead As IList, checkWrite As IList, checkError As IList, microSeconds As Integer)

參數

checkRead
IList

IList Socket以下是檢查可讀性的例子。

checkWrite
IList

IList Socket以下是檢查可寫性的情況。

checkError
IList

IList有幾個Socket例子可以用來檢查錯誤。

microSeconds
Int32

以微秒為單位的逾時值。 -1 值表示無限次逾時。

例外狀況

這些 checkRead、 、 和 checkError 參數皆為全nullcheckWrite或為空。 至少有一個 checkReadcheckWritecheckError 必須包含至少一個 Socket

嘗試存取套接字時發生錯誤。

.NET 5 和更新版本:處置一或多個套接字。

checkRead參數 、 checkWritecheckError 或 包含過多套接字。

範例

以下程式碼範例用 Select 來判斷哪些監聽套接字有連線請求。

IPHostEntry ipHostEntry = Dns.Resolve(Dns.GetHostName());
IPAddress ipAddress = ipHostEntry.AddressList[0];

Socket socket0 = null;
Socket socket1 = null;
Socket socket2 = null;
Socket socket3 = null;
Socket socket4 = null;
Socket socket5 = null;

ArrayList listenList = new ArrayList();
listenList.Add(socket0);
listenList.Add(socket1);
listenList.Add(socket2);

ArrayList acceptList = new ArrayList();
acceptList.Add(socket3);
acceptList.Add(socket4);
acceptList.Add(socket5);

for( int i = 0; i < 3; i++ )
{
  listenList[i] = new Socket(AddressFamily.InterNetwork,
                             SocketType.Stream,
                             ProtocolType.Tcp);
  ((Socket)listenList[i]).Bind(new IPEndPoint(ipAddress, 11000 + i));
  ((Socket)listenList[i]).Listen(10);
}

// Only the sockets that contain a connection request
// will remain in listenList after Select returns.

Socket.Select(listenList, null, null, 1000);

for( int i = 0; i < listenList.Count; i++ )
{
  acceptList[i] = ((Socket)listenList[i]).Accept();
}
Dim ipHostEntry As IPHostEntry = Dns.Resolve(Dns.GetHostName())
Dim ipAddress As IPAddress = ipHostEntry.AddressList(0)

Dim socket0 As Socket = Nothing
Dim socket1 As Socket = Nothing
Dim socket2 As Socket = Nothing
Dim socket3 As Socket = Nothing
Dim socket4 As Socket = Nothing
Dim socket5 As Socket = Nothing

Dim listenList As New ArrayList()
listenList.Add(socket0)
listenList.Add(socket1)
listenList.Add(socket2)

Dim acceptList As New ArrayList()
acceptList.Add(socket3)
acceptList.Add(socket4)
acceptList.Add(socket5)

Dim i As Integer
For i = 0 To 2
   listenList(i) = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
   CType(listenList(i), Socket).Bind(New IPEndPoint(ipAddress, 11000 + i))
   CType(listenList(i), Socket).Listen(10)
Next i

'Only the sockets that contain a connection request
'will remain in listenList after Select returns.
Socket.Select(listenList, Nothing, Nothing, 1000)

For i = 0 To listenList.Count - 1
   acceptList(i) = CType(listenList(i), Socket).Accept()
Next i

備註

Select 是一種靜態方法,用來決定一個或多個 Socket 實例的狀態。 你必須先裝一個或多個插座, IList 才能使用這個 Select 方法。 以參數呼叫 SelectIListcheckRead檢查可讀性。 要檢查你的 socket 是否可寫入,可以使用參數 checkWrite 。 為了偵測錯誤條件,請使用 checkError。 呼叫 Select後, IList 將只填充符合條件的套接字。

如果你處於聆聽狀態,可讀性表示呼叫 能 Accept 成功且不會被阻塞。 如果您已經接受連線,可讀性表示數據可供讀取。 在這些情況下,所有接收作業都會成功,而不會封鎖。 可讀性也可以判斷遠端是否 Socket 已關閉連線;在這種情況下,呼叫 Receive 的 將立即回傳,且回傳位元組為零。

Select當至少一個感興趣的套字(、 、 checkError 及 列表中的checkReadcheckWrite套接字)符合其指定條件,或參數超過時microSeconds,以先到者為準。 microSeconds設定為 -1 則指定無限超時。

如果你對 ,發出非阻塞性的呼叫 Connect,可寫性表示你已成功連線。 如果您已建立連線,可寫入性表示所有傳送作業都會成功,而不會封鎖。

如果你對 進行非阻塞呼叫 Connect,參數 checkerror 會識別尚未成功連接的套接字。

注意

如果你只想判斷單一 Socket的狀態,請使用此Poll方法。

注意

此方法無法偵測某些類型的連線問題,例如中斷的網路纜線,或遠端主機無法正常關閉。 您必須嘗試傳送或接收數據,以偵測這類錯誤。

注意

如果你收到 SocketException,請使用該 SocketException.ErrorCode 屬性取得特定的錯誤代碼。 取得此程式碼後,請參閱 Windows Sockets 版本 2 API 錯誤代碼 文件,以獲得錯誤的詳細說明。

另請參閱

適用於