Socket 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
实现 Berkeley 套接字接口。
public ref class Socket : IDisposablepublic class Socket : IDisposabletype Socket = class
    interface IDisposablePublic 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,同时将 转发 CancellationToken 到异步方法,使整个操作可取消。
提示
Socket不采用 CancellationToken 的异步方法通常返回 Task,该方法在堆上分配。 可取消重载始终 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 的详细信息,请参阅 套接字的补充 API 备注。
构造函数
| Socket(AddressFamily, SocketType, ProtocolType) | 使用指定的地址族、套接字类型和协议初始化 Socket 类的新实例。 | 
| Socket(SafeSocketHandle) | 为指定的套接字句柄初始化 Socket 类的新实例。 | 
| Socket(SocketInformation) | 使用 Socket 返回的指定的值初始化 DuplicateAndClose(Int32) 类的新实例。 | 
| Socket(SocketType, ProtocolType) | 使用指定的地址族、套接字类型和协议初始化 Socket 类的新实例。 如果操作系统支持 IPv6,则此构造函数将创建双模式套接字;否则,它将创建 IPv4 套接字。 | 
属性
| AddressFamily | 获取 Socket 的地址族。 | 
| Available | 获取已经从网络接收且可供读取的数据量。 | 
| Blocking | 获取或设置一个值,该值指示 Socket 是否处于阻止模式。 | 
| Connected | |
| DontFragment | 获取或设置一个值,该值指定 Socket 是否允许将 Internet 协议 (IP) 数据报分段。 | 
| DualMode | 获取或设置一个值, Socket 该值指定 是否是同时用于 IPv4 和 IPv6 的双模式套接字。 | 
| EnableBroadcast | |
| ExclusiveAddressUse | |
| Handle | 获取 Socket 的操作系统句柄。 | 
| IsBound | 获取一个值,该值指示 Socket 是否绑定到特定本地端口。 | 
| LingerState | 获取或设置一个值,该值指定 Socket 在尝试发送所有挂起数据时是否延迟关闭套接字。 | 
| LocalEndPoint | 获取本地终结点。 | 
| MulticastLoopback | 获取或设置一个值,该值指定传出的多路广播数据包是否传递到发送应用程序。 | 
| NoDelay | |
| OSSupportsIPv4 | 指示基础操作系统和网络适配器是否支持 Internet 协议第 4 版 (IPv4)。 | 
| OSSupportsIPv6 | 指示基础操作系统和网络适配器是否支持 Internet 协议第 6 版 (IPv6)。 | 
| OSSupportsUnixDomainSockets | 指示基础操作系统是否支持 Unix 域套接字。 | 
| ProtocolType | 获取 Socket 的协议类型。 | 
| ReceiveBufferSize | 获取或设置一个值,它指定 Socket 接收缓冲区的大小。 | 
| ReceiveTimeout | 获取或设置一个值,该值指定之后同步 Receive 调用将超时的时间长度。 | 
| RemoteEndPoint | 获取远程终结点。 | 
| SafeHandle | 获取一个 SafeSocketHandle,它表示当前 Socket 对象封装的套接字句柄。 | 
| SendBufferSize | 获取或设置一个值,该值指定 Socket 发送缓冲区的大小。 | 
| SendTimeout | 获取或设置一个值,该值指定之后同步 Send 调用将超时的时间长度。 | 
| SocketType | 获取 Socket 的类型。 | 
| SupportsIPv4 | 
				已过时.
			 
				已过时.
			 
				已过时.
			 获取一个值,该值指示在当前主机上 IPv4 支持是否可用并且已启用。 | 
| SupportsIPv6 | 
				已过时.
			 
				已过时.
			 
				已过时.
			 获取一个值,该值指示 Framework 对某些已过时的 Dns 成员是否支持 IPv6。 | 
| Ttl | 获取或设置一个值,指定 Socket 发送的 Internet 协议 (IP) 数据包的生存时间 (TTL) 值。 | 
| UseOnlyOverlappedIO | 
				已过时.
			 获取或设置一个值,该值指定套接字是否应仅使用重叠 I/O 模式。 在 .NET 5+ ((包括 .NET Core 版本) )上,值始终  | 
方法
显式接口实现
| IDisposable.Dispose() | 此 API 支持产品基础结构,不能在代码中直接使用。 释放由 Socket 使用的所有资源。 | 
扩展方法
适用于
线程安全性
在实例上 Socket 同时执行发送和接收操作是安全的,但不建议同时发出多个发送或多个接收调用。 根据基础平台实现,这可能会导致大型或多缓冲区发送或接收出现意外的数据交错。