C# Socket 編程


EndPoint 類

標識網絡地址。這是一個 abstract 類。

命名空間:  System.Net
程序集:  System(在 System.dll 中)

[SerializableAttribute]
public abstract class EndPoint

備注

EndPoint 類提供了一個表示網絡資源或服務的 abstract 基類。子類組合網絡連接信息以構成服務的連接點。

繼承層次結構

System.Object
System.Net.EndPoint
System.Net.IPEndPoint

Socket.Bind 方法

使 Socket與一個本地終結點相關聯。

命名空間:  System.Net.Sockets
程序集:  System(在 System.dll 中)

public void Bind(EndPoint localEP )
參數
localEP
類型: System.Net.EndPoint

要與 Socket關聯的本地 EndPoint

異常
ArgumentNullException

localEP 為 nullNothingnullptrnull 引用(在 Visual Basic 中為 Nothing)。

SocketException

試圖訪問套接字時發生錯誤。有關更多信息,請參見備注部分。

ObjectDisposedException

Socket已關閉。

SecurityException

調用堆棧上部的調用方無權執行所請求的操作。

備注

如果需要使用特定的本地終結點,請使用 Bind 方法。必須先調用 Bind,然后才能調用 Listen方法。除非需要使用特定的本地終結點,否則不必在使用 Connect方法之前調用 Bind。對無連接和面向連接的協議都可以使用 Bind 方法。

在調用 Bind 之前,必須首先創建打算從其進行數據通信的本地 IPEndPoint。如果您不介意分配哪個本地地址,則可以用 IPAddress.Any作為地址參數創建一個 IPEndPoint,這樣,基礎服務提供程序將會分配最適合的網絡地址。如果您有多個網絡接口,這將有助於簡化您的應用程序。如果您不介意使用哪個本地端口,則可以創建一個使用 0 作為端口號的 IPEndPoint。在這種情況下,服務提供程序將會分配一個可用的端口號(介於 1024 和 5000 之間)。

如果使用上面的方法,您可以通過調用 LocalEndPoint獲知所分配的本地網絡地址和端口號。如果當前使用的是面向連接的協議,則直到您調用了 Connect或 EndConnect方法后,LocalEndPoint才會返回本地分配的網絡地址。如果當前使用的是無連接協議,則直到完成一個發送或接收操作后,才可訪問該信息。

注意:

如果打算接收多路廣播的數據報,則必須使用多路廣播端口號調用 Bind 方法。

注意:

如果打算通過使用 ReceiveFrom方法來接收無連接的數據報,則必須調用 Bind 方法。

注意:

如果在調用 Bind 方法時接收到 SocketException,則可以使用 SocketException.ErrorCode屬性獲取特定的錯誤代碼。獲取此代碼后,您可以參考 MSDN Library 中的 Windows Sockets 第 2 版 API 錯誤代碼文檔,獲取有關該錯誤的詳細說明。

注意:

當在應用程序中啟用網絡跟蹤功能后,此成員將輸出跟蹤信息。有關更多信息,請參見 網絡跟蹤。

Socket.Listen 方法

將 Socket置於偵聽狀態。

命名空間:  System.Net.Sockets
程序集:  System(在 System.dll 中)

public void Listen(
int backlog
)

參數
backlog
類型:System.Int32

掛起連接隊列的最大長度。

異常
SocketException

試圖訪問套接字時發生錯誤。有關更多信息,請參見備注部分。

ObjectDisposedException

Socket已關閉。

備注

Listen 可以讓一個面向連接的 Socket偵聽傳入的連接嘗試。backlog 參數指定隊列中最多可容納的等待接受的傳入連接數。若要確定可指定的最大連接數,請檢索 MaxConnections值。Listen 不會阻止。

如果收到 SocketException,請使用 ErrorCode屬性獲取特定的錯誤代碼。獲取此代碼后,您可以參考 MSDN Library 中的 Windows Sockets 第 2 版 API 錯誤代碼文檔,獲取有關該錯誤的詳細說明。可使用 AcceptBeginAccept來接受來自隊列的連接。

注意:

在調用 Listen 之前,必須首先調用 Bind方法,否則 Listen 將引發 SocketException

注意:

當在應用程序中啟用網絡跟蹤功能后,此成員將輸出跟蹤信息。有關更多信息,請參見 網絡跟蹤。

注意:

根據操作系統的不同,backlog 參數被限制為不同的值。您可以指定更大的值,但 backlog 將受操作系統的限制。

 

Socket.BeginAccept 方法

開始一個異步操作來接受一個傳入的連接嘗試。

重載列表

BeginAccept(AsyncCallback, Object)
開始一個異步操作來接受一個傳入的連接嘗試。

BeginAccept(Int32, AsyncCallback, Object)
開始異步操作以接受傳入的連接嘗試並接收客戶端應用程序發送的第一個數據塊。

BeginAccept(Socket, Int32, AsyncCallback, Object)
開始異步操作以接受從指定套接字傳入的連接嘗試並接收客戶端應用程序發送的第一個數據塊。

命名空間:  System.Net.Sockets
程序集:  System(在 System.dll 中)

語法

[HostProtectionAttribute(SecurityAction.LinkDemand, ExternalThreading = true)] public IAsyncResult BeginAccept( AsyncCallback callback, Object state )
參數
callback
類型:System.AsyncCallback

AsyncCallback 委托。

state
類型:System.Object

一個對象,它包含此請求的狀態信息。

返回值

類型:System.IAsyncResult

一個 IAsyncResult,它引用異步 Socket創建。

異常

 

ObjectDisposedException

Socket對象已關閉。

NotSupportedException

此方法需要 Windows NT。

InvalidOperationException

正在接受的套接字不會偵聽連接。在調用 BeginAccept之前必須調用 Bind和 Listen

- 或 -

已接受的套接字是綁定的。

ArgumentOutOfRangeException

receiveSize 小於 0。

SocketException

試圖訪問套接字時發生錯誤。有關更多信息,請參見備注部分。

備注

注意:

應用到此 的 HostProtectionAttribute 屬性 (attribute) 具有以下 Resources 屬性 (property) 值:ExternalThreading。HostProtectionAttribute 不影響桌面應用程序(這些應用程序通常通過雙擊圖標、鍵入命令或在瀏覽器中輸入 URL 來啟動)。有關更多信息,請參見 HostProtectionAttribute 類或 SQL Server 編程和宿主保護屬性。

面向連接的協議可以使用 BeginAccept方法來異步處理傳入的連接嘗試。以異步方式接受連接將使您能夠在單獨的執行線程中發送和接收數據。在調用 BeginAccept方法之前,必須調用 Listen方法來偵聽傳入的連接請求,並將偵聽到的請求放入隊列中。

必須創建實現 AsyncCallback 委托的回調方法,並將其名稱傳遞給 BeginAccept方法。若要實現這一點,至少必須通過 state 參數將實施偵聽的 Socket對象傳遞給 BeginAccept。如果您的回調需要更多信息,則可以創建一個小型類來保存 Socket和其他必需的信息。通過 state 參數將此類的一個實例傳遞給 BeginAccept方法。

回調方法應調用 EndAccept方法。應用程序調用 BeginAccept時,系統會使用單獨的線程執行指定的回調方法,並在 EndAccept上一直處於阻止狀態,直到檢索到掛起的連接。EndAccept將會返回新的 Socket對象,供您用來向遠程主機發送數據和從遠程主機接收數據。不能使用返回的這個 Socket接受連接隊列中的任何附加連接。如果想要在調用 BeginAccept方法后使原始線程阻止,請使用 WaitHandle..::.WaitOne。當需要原始線程繼續執行時,請在回調方法中調用 ManualResetEvent 的 Set 方法。有關編寫回調方法的其他信息,請參見 Callback 示例。

注意:

可以調用返回的 Socket的 RemoteEndPoint方法來標識遠程主機的網絡地址和端口號。

注意:

如果收到 SocketException,請使用 SocketException..::.ErrorCode屬性獲取特定的錯誤代碼。獲取此代碼后,可以參考 MSDN 中的 Windows Sockets 第 2 版 API 錯誤代碼文檔,獲取有關此錯誤的詳細說明。

注意:

當在應用程序中啟用網絡跟蹤功能后,此成員將輸出跟蹤信息。有關更多信息,請參見 網絡跟蹤。

注意:

執行上下文(安全上下文、模擬用戶及調用上下文)會被緩存,以用於 Socket異步方法。在首次使用一個特定上下文(特定 Socket異步方法、特定 Socket實例及特定回調)后,該上下文的后續使用將得到性能改

Socket.EnableBroadcast 屬性

獲取或設置一個 Boolean 值,該值指定 Socket是否可以發送或接收廣播數據包。

命名空間:  System.Net.Sockets
程序集:  System(在 System.dll 中)

語法

public bool EnableBroadcast { get; set; }
屬性值

類型:System.Boolean

如果 Socket允許廣播數據包,則為 true;否則為 false。默認為 false。

異常

SocketException

此選項僅對數據報套接字有效。

ObjectDisposedException

Socket已關閉。

備注

廣播僅限於特定子網,並且必須使用用戶數據報協議 (UDP)。對於 Internet 協議版本 4,可通過向 255.255.255.255 發送數據包來向本地子網廣播;也可以使用定向廣播地址,即 Internet 協議 (IP) 地址的網絡部分,同時所有位都在主機部分設置。例如,如果 IP 地址是 192.168.1.40(C 類地址,網絡掩碼為 255.255.255.0,網絡部分是前三個八進制數,主機部分是最后一個八進制數),則您的定向廣播地址是 192.168.1.255。

對傳輸控制協議 (TCP) 套接字設置此屬性不起任何作用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM