Socket 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
實作 Berkeley 套接字介面。
public ref class Socket : IDisposable
public class Socket : IDisposable
type Socket = class
interface IDisposable
Public Class Socket
Implements IDisposable
- 繼承
-
Socket
- 實作
範例
以下範例展示了如何利用該 Socket 類別將資料傳送到 HTTP 伺服器,並將 ASCII 回應印出標準輸出。 此範例會阻塞呼叫執行緒,直到整個頁面被接收完畢。
private static void SendHttpRequest(Uri? uri = null, int port = 80)
{
uri ??= new Uri("http://example.com");
// Construct a minimalistic HTTP/1.1 request
byte[] requestBytes = Encoding.ASCII.GetBytes(@$"GET {uri.AbsoluteUri} HTTP/1.0
Host: {uri.Host}
Connection: Close
");
// Create and connect a dual-stack socket
using Socket socket = new Socket(SocketType.Stream, ProtocolType.Tcp);
socket.Connect(uri.Host, port);
// Send the request.
// For the tiny amount of data in this example, the first call to Send() will likely deliver the buffer completely,
// however this is not guaranteed to happen for larger real-life buffers.
// The best practice is to iterate until all the data is sent.
int bytesSent = 0;
while (bytesSent < requestBytes.Length)
{
bytesSent += socket.Send(requestBytes, bytesSent, requestBytes.Length - bytesSent, SocketFlags.None);
}
// Do minimalistic buffering assuming ASCII response
byte[] responseBytes = new byte[256];
char[] responseChars = new char[256];
while (true)
{
int bytesReceived = socket.Receive(responseBytes);
// Receiving 0 bytes means EOF has been reached
if (bytesReceived == 0) break;
// Convert byteCount bytes to ASCII characters using the 'responseChars' buffer as destination
int charCount = Encoding.ASCII.GetChars(responseBytes, 0, bytesReceived, responseChars, 0);
// Print the contents of the 'responseChars' buffer to Console.Out
Console.Out.Write(responseChars, 0, charCount);
}
}
下一個範例展示了相同的 HTTP GET 情境,使用基於任務的非同步 API,同時將 a CancellationToken 轉發給非同步方法,使整個操作可取消。
Tip
Socket的非同步方法通常不回傳 CancellationToken a Task,該 a 分配於堆積中。 Cancellable 過載總是 ValueTask會回傳;使用它們有助於減少高效能程式碼中的配置。
private static async Task SendHttpRequestAsync(Uri? uri = null, int port = 80, CancellationToken cancellationToken = default)
{
uri ??= new Uri("http://example.com");
// Construct a minimalistic HTTP/1.1 request
byte[] requestBytes = Encoding.ASCII.GetBytes(@$"GET {uri.AbsoluteUri} HTTP/1.1
Host: {uri.Host}
Connection: Close
");
// Create and connect a dual-stack socket
using Socket socket = new Socket(SocketType.Stream, ProtocolType.Tcp);
await socket.ConnectAsync(uri.Host, port, cancellationToken);
// Send the request.
// For the tiny amount of data in this example, the first call to SendAsync() will likely deliver the buffer completely,
// however this is not guaranteed to happen for larger real-life buffers.
// The best practice is to iterate until all the data is sent.
int bytesSent = 0;
while (bytesSent < requestBytes.Length)
{
bytesSent += await socket.SendAsync(requestBytes.AsMemory(bytesSent), SocketFlags.None);
}
// Do minimalistic buffering assuming ASCII response
byte[] responseBytes = new byte[256];
char[] responseChars = new char[256];
while (true)
{
int bytesReceived = await socket.ReceiveAsync(responseBytes, SocketFlags.None, cancellationToken);
// Receiving 0 bytes means EOF has been reached
if (bytesReceived == 0) break;
// Convert byteCount bytes to ASCII characters using the 'responseChars' buffer as destination
int charCount = Encoding.ASCII.GetChars(responseBytes, 0, bytesReceived, responseChars, 0);
// Print the contents of the 'responseChars' buffer to Console.Out
await Console.Out.WriteAsync(responseChars.AsMemory(0, charCount), cancellationToken);
}
}
備註
欲了解更多關於此 API 的資訊,請參閱 Socket 的補充 API 備註。
建構函式
| 名稱 | Description |
|---|---|
| Socket(AddressFamily, SocketType, ProtocolType) |
使用指定的位址族、套接字類型與協定初始化該類別的新 Socket 實例。 |
| Socket(SafeSocketHandle) |
初始化該類別的新實例 Socket ,以啟用指定的套接字句柄。 |
| Socket(SocketInformation) |
使用從 返回Socket的指定值初始化該類別的新DuplicateAndClose(Int32)實例。 |
| Socket(SocketType, ProtocolType) |
使用指定的套接字類型與協定初始化該類別的新 Socket 實例。 若作業系統支援 IPv6,此建構子會產生雙模式套接字;否則,它會建立一個 IPv4 插槽。 |
屬性
| 名稱 | Description |
|---|---|
| AddressFamily |
取得 的 Socket地址族。 |
| Available |
取得從網路接收並可讀取的資料量。 |
| Blocking |
取得或設定一個值,表示是否 Socket 處於阻擋模式。 |
| Connected | |
| DontFragment |
取得或設定一個值,指定是否 Socket 允許網際協定(IP)資料報碎片化。 |
| DualMode |
取得或設定一個值,指定 是否 Socket 同時用於 IPv4 和 IPv6 的雙模式套接字。 |
| EnableBroadcast | |
| ExclusiveAddressUse |
取得或設定一個值,指示是否 Socket 只允許一個程序綁定一個埠。 |
| Handle |
取得作業系統的 handle Socket。 |
| IsBound |
會得到一個值,表示是否 Socket 綁定到特定的本地埠。 |
| LingerState |
取得或設定一個值,指定是否 Socket 會延遲關閉套接字以嘗試傳送所有待處理的資料。 |
| LocalEndPoint |
取得本地端點。 |
| MulticastLoopback |
取得或設定一個值,指定是否將發出的多播封包送達給發送端應用程式。 |
| NoDelay | |
| OSSupportsIPv4 |
顯示底層作業系統及網路適配器是否支援網際網路協定第4版(IPv4)。 |
| OSSupportsIPv6 |
顯示底層作業系統及網路轉接器是否支援網際網路協定第6版(IPv6)。 |
| OSSupportsUnixDomainSockets |
顯示底層作業系統是否支援 Unix 網域套接字。 |
| ProtocolType |
取得 的協定類型 Socket是 。 |
| ReceiveBufferSize |
取得或設定一個值,指定接收緩衝區 Socket的大小。 |
| ReceiveTimeout |
取得或設定一個值,指定 Receive 同步呼叫逾時的時間。 |
| RemoteEndPoint |
取得遠端端點。 |
| SafeHandle |
會得到 SafeSocketHandle 代表當前 Socket 物件封裝的套接字代柄的 。 |
| SendBufferSize |
取得或設定一個值,指定 的傳送緩衝區 Socket大小。 |
| SendTimeout |
取得或設定一個值,指定 Send 同步呼叫逾時的時間。 |
| SocketType |
取得 Socket的型別。 |
| SupportsIPv4 |
已淘汰.
已淘汰.
已淘汰.
會顯示目前主機是否支援並啟用 IPv4 支援。 |
| SupportsIPv6 |
已淘汰.
已淘汰.
已淘汰.
會獲得一個值,表示框架是否支援某些過時 Dns 成員的 IPv6。 |
| Ttl |
取得或設定一個值,指定由 .Socket |
| UseOnlyOverlappedIO |
已淘汰.
取得或設定一個值,指定套接字是否只應使用重疊 I/O 模式。 在 .NET 5+(包括 .NET Core 版本)中,值總是 |
方法
明確介面實作
| 名稱 | Description |
|---|---|
| IDisposable.Dispose() |
此 API 支援此產品基礎結構,但無法直接用於程式碼之中。 釋放 Socket所使用的所有資源。 |
擴充方法
適用於
執行緒安全性
同時 Socket 執行一個實例的發送與接收操作是安全的,但不建議同時發出多個發送或多個接收呼叫。 根據底層平台的實作,這可能導致大型或多緩衝區的發送或接收時出現非預期的資料交錯。