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,同时转发 CancellationToken 到异步方法,使整个操作可取消。
Tip
Socket不采用 CancellationToken 通常返回 Task的异步方法,该方法在堆上分配。 可取消的重载始终 ValueTask是 -returning;使用它们有助于减少高性能代码中的分配。
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);
}
}
注解
该 Socket 类为网络通信提供了一组丰富的方法和属性。 通过 Socket 类,可以使用枚举中列出的 ProtocolType 任何通信协议执行同步和异步数据传输。
该 Socket 类遵循异步方法的 .NET 命名模式。 例如,同步 Receive 方法对应于异步 ReceiveAsync 变体。
使用以下方法进行同步操作模式:
- 如果使用面向连接的协议(如 TCP),则服务器可以使用该方法 Listen 侦听连接。 该 Accept 方法处理任何传入的连接请求,并返回一个 Socket,您可以使用它与远程主机进行数据通信。 使用此返回 Socket 方法调用 Send 或 Receive 方法。 Bind如果要指定本地 IP 地址和端口号,请在调用该方法之前调用Listen该方法。 如果希望基础服务提供商为你分配免费端口,请使用端口号为零。 如果要连接到侦听主机,请调用该方法 Connect 。 若要传达数据,请调用 Send 或 Receive 方法。
- 如果使用无连接协议(如 UDP),则根本不需要侦听连接。 ReceiveFrom调用该方法以接受任何传入的数据报。 SendTo使用该方法将数据报发送到远程主机。
若要异步处理通信,请使用以下方法:
- 如果使用面向连接的协议(如 TCP),则用于 ConnectAsync 与侦听主机连接。 使用 SendAsync 或 ReceiveAsync 异步通信数据。 可以使用 AcceptAsync.. 处理传入的连接请求。
- 如果使用无连接协议(如 UDP),则可以用于 SendToAsync 发送数据报和 ReceiveFromAsync 接收数据报。
如果在套接字上执行多个异步操作,它们不一定按启动顺序完成。
完成发送和接收数据后,请使用Shutdown方法禁用Socket。 调用 Shutdown后,调用 Close 该方法以释放与该 Socket资源关联的所有资源。
类Socket允许你通过Socket方法来配置SetSocketOption。 使用 GetSocketOption 该方法检索这些设置。
构造函数
| 名称 | 说明 |
|---|---|
| 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 |
获取或设置一个值,该值指示 Socket 是否只允许一个进程绑定到端口。 |
| 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 |
已过时.
已过时.
已过时.
获取一个值,该值指示框架是否支持某些过时 Dns 成员的 IPv6。 |
| Ttl |
获取或设置一个值,该值指定 Internet 协议 (IP) 数据包发送的 Socket生存时间 (TTL) 值。 |
| UseOnlyOverlappedIO |
已过时.
获取或设置一个值,该值指定套接字是否只应使用重叠 I/O 模式。 在 .NET 5+ (包括 .NET Core 版本),该值始终 |
方法
显式接口实现
| 名称 | 说明 |
|---|---|
| IDisposable.Dispose() |
此 API 支持产品基础结构,不能在代码中直接使用。 释放该 Socket命令使用的所有资源。 |
扩展方法
适用于
线程安全性
在实例上 Socket 同时执行发送和接收操作是安全的,但不建议同时发出多个发送或多个接收调用。 根据基础平台实现,这可能会导致大型或多缓冲区发送或接收的意外数据交错。