首页 > 代码库 > Socket.Available 属性

Socket.Available 属性

获取已经从网络接收且可供读取的数据量。

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

从网络接收的、可供读取的数据的字节数。

异常

 
ExceptionCondition
SocketException

试图访问套接字时发生错误。有关更多信息,请参见备注部分。

ObjectDisposedException

Socket 已关闭。

备注
 

如果当前使用的是非阻止 Socket,一种较好的做法是在调用 Receive 之前使用 Available 来确定数据是否排队等待读取。可用的数据即网络缓冲区中排队等待读取的全部数据。如果在网络缓冲区中没有排队的数据,则 Available 返回 0。

如果远程主机处于关机状态或关闭了连接,则 Available 会引发 SocketException。如果收到 SocketException,请使用 SocketException.ErrorCode 属性获取特定的错误代码。获取此代码后,您可以参考 MSDN Library 中的 Windows Sockets 第 2 版 API 错误代码文档,获取有关该错误的详细说明。

注意

当应用程序中启用了网络跟踪时,此成员将输出跟踪信息。有关详细信息,请参阅 .NET Framework 中的网络跟踪。

示例

 

下面的代码示例比较用 FIONREAD 和 Available 属性调用 IOControl 的结果。

 1 // FIONREAD is also available as the "Available" property.
 2 public const int FIONREAD   = 0x4004667F;
 3 
 4 static void DisplayPendingByteCount(Socket s)
 5  {
 6      byte[] outValue = http://www.mamicode.com/BitConverter.GetBytes(0);
 7 
 8      // Check how many bytes have been received.
 9      s.IOControl(FIONREAD, null, outValue);
10 
11      uint bytesAvailable = BitConverter.ToUInt32(outValue, 0);
12      Console.WriteLine("server has {0} bytes pending. Available property says {1}.",
13          bytesAvailable, s.Available);
14 
15      return;
16  }

Socket.Receive 方法 (Byte[], Int32, SocketFlags)

使用指定的 SocketFlags,从绑定的 Socket 接收指定字节数的数据,并将数据存入接收缓冲区。

语法

 

C# 
public int Receive(
	byte[] buffer,
	int size,
	SocketFlags socketFlags
)

参数

buffer

Byte 类型的数组,它是存储接收到的数据的位置。

size

要接收的字节数。

socketFlags

SocketFlags 值的按位组合。

返回值

Type: System.Int32

接收到的字节数。

异常
 

ExceptionCondition
ArgumentNullException

buffernull

ArgumentOutOfRangeException

size 超出了 buffer 的大小。

SocketException

试图访问套接字时发生错误。有关更多信息,请参见备注部分。

ObjectDisposedException

Socket 已关闭。

SecurityException

调用堆栈中的调用方没有所需的权限。

备注
 

Receive 方法将数据读入 buffer 参数,并返回成功读取的字节数。从面向连接的套接字和无连接套接字中都可以调用 Receive。

此重载仅要求提供接收缓冲区、要接收的字节数和必需的 SocketFlags。

如果您使用的是面向连接的协议,则在调用 Receive 之前,必须调用 Connect 以建立一个远程主机连接,或者调用 Accept 以接受传入的连接。 Receive 方法只读取在 Connect 或 Accept 方法中建立的远程主机发送的数据。如果您使用的是无连接协议,则您也可以使用 ReceiveFrom 方法。 ReceiveFrom 将允许您收到从任何主机传入的数据。

如果没有可读取的数据,则 Receive 方法将一直处于阻止状态,直到数据可用,除非使用 Socket.ReceiveTimeout 设置了超时值。如果超过超时值,Receive 调用将引发 SocketException。如果您处于非阻止模式,并且协议堆栈缓冲区中没有可用的数据,则 Receive 方法将立即完成并引发 SocketException。您可以使用 Available 属性确定是否有数据可以读取。如果 Available 为非零,请重试接收操作。

如果当前使用的是面向连接的 Socket,则 Receive 方法将读取所有可用的数据,直到达到 size 参数指定的字节数。如果远程主机使用 Shutdown 方法关闭了 Socket 连接,并且所有可用数据均已收到,则 Receive 方法将立即完成并返回零字节。

如果当前使用的是无连接 Socket,则 Receive 将从您在 Connect 方法中指定的目标地址处读取第一个排队的数据报。如果您接收到的数据报大于 buffer 参数的大小,则 buffer 将用消息的第一部分填充,多余的数据都会丢失,并且会引发 SocketException。

技术分享注意

如果收到 SocketException,请使用 SocketException.ErrorCode 属性获取特定的错误代码。获取此代码后,您可以参考 MSDN Library 中的 Windows Sockets 第 2 版 API 错误代码文档,获取有关该错误的详细说明。

技术分享注意

当应用程序中启用了网络跟踪时,此成员将输出跟踪信息。有关详细信息,请参阅 .NET Framework 中的网络跟踪。

示例
 

下面的示例将已发现的数据接收到 buffer 中,并将 SocketFlags 指定为 None。

C# 
// Receive the host home page content and loop until all the data is received.
Int32 bytes = s.Receive(RecvBytes, RecvBytes.Length, 0);
strRetPage = "Default HTML page on " + server + ":\r\n";
strRetPage = strRetPage + ASCII.GetString(RecvBytes, 0, bytes);

while (bytes > 0)
{
  bytes = s.Receive(RecvBytes, RecvBytes.Length, 0);
  strRetPage = strRetPage + ASCII.GetString(RecvBytes, 0, bytes);
}

安全性
 

SocketPermission

用于接受来自网络的连接。关联枚举:Accept。

 

Socket.Available 属性