Socket.Available 属性
获取已经从网络接收且可供读取的数据量。
命名空间: System.Net.Sockets
程序集: System(System.dll 中)
从网络接收的、可供读取的数据的字节数。
异常
| Exception | Condition |
|---|---|
| SocketException |
试图访问套接字时发生错误。有关更多信息,请参见备注部分。 |
| ObjectDisposedException |
Socket 已关闭。 |
如果当前使用的是非阻止 Socket,一种较好的做法是在调用 Receive 之前使用 Available 来确定数据是否排队等待读取。可用的数据即网络缓冲区中排队等待读取的全部数据。如果在网络缓冲区中没有排队的数据,则 Available 返回 0。
如果远程主机处于关机状态或关闭了连接,则 Available 会引发 SocketException。如果收到 SocketException,请使用 SocketException.ErrorCode 属性获取特定的错误代码。获取此代码后,您可以参考 MSDN Library 中的 Windows Sockets 第 2 版 API 错误代码文档,获取有关该错误的详细说明。
| 注意 |
|---|
|
当应用程序中启用了网络跟踪时,此成员将输出跟踪信息。有关详细信息,请参阅 .NET Framework 中的网络跟踪。 |
示例
下面的代码示例比较用 FIONREAD 和 Available 属性调用 IOControl 的结果。
// FIONREAD is also available as the "Available" property.
public const int FIONREAD = 0x4004667F; static void DisplayPendingByteCount(Socket s)
{
byte[] outValue = BitConverter.GetBytes(); // Check how many bytes have been received.
s.IOControl(FIONREAD, null, outValue); uint bytesAvailable = BitConverter.ToUInt32(outValue, );
Console.WriteLine("server has {0} bytes pending. Available property says {1}.",
bytesAvailable, s.Available); return;
}
Socket.Receive 方法 (Byte[], Int32, SocketFlags)
使用指定的 SocketFlags,从绑定的 Socket 接收指定字节数的数据,并将数据存入接收缓冲区。
语法
public int Receive(
byte[] buffer,
int size,
SocketFlags socketFlags
)
| Exception | Condition |
|---|---|
| ArgumentNullException |
buffer 为 null。 |
| 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。
// 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);
}
用于接受来自网络的连接。关联枚举:Accept。
Socket.Available 属性的更多相关文章
- ZeroMQ接口函数之 :zmq_setsockopt –设置ZMQ socket的属性
ZeroMQ API 目录 :http://www.cnblogs.com/fengbohello/p/4230135.html 本文地址 :http://www.cnblogs.com/fengbo ...
- ZeroMQ接口函数之 :zmq_getsockopt – 获取ZMQ socket的属性
ZeroMQ API 目录 :http://www.cnblogs.com/fengbohello/p/4230135.html 本文地址 :http://www.cnblogs.com/fengbo ...
- 服务端socket重用属性设置
初始化socket socket是一种系统资源,并不是每次初始化都一定成功,因此为了避免初始化失败,一般使用多次初始化的方式,如下所示: unsigned int times = 0x0; while ...
- python-day7-静态方法、类方法、属性方法、特殊成员方法、反射、异常处理、socket
@特殊方法.异常处理.反射.socket @类 属性 实例变量 类变量 私有属性__var 方法 构造方法, 析构函数(python自带,不写也有,写了相当与重构) 私有方法 继承 继承 组合 @7. ...
- Linux IPC socket 广播,组播
getsockopt()/setsockopt() //获得sockfd指向的socket的属性 int getsockopt(int sockfd, int level, int optname, ...
- socket:通常每个套接字地址(协议/网络地址/端口)只允许使用一次
有两种解决方法,一种是加入try{}catch(){},程序就不会抱错了:一种是在设置好监听SOCKET后,将SOCKET的属性设置为可重复使用地址,如://创建监听SOCKET socketList ...
- Socket Receive 避免 Blocking
我们知道 Socket Blocking 属性默认true . 表明Socket 处于同步调用 , Connect , 或 Send , Receive 需等待动作 完成才能继续执行. 有一种应用场景 ...
- Linux IPC socket编程基础
头文件 #include<unistd.h> #include <sys/types.h> #include <sys/socket.h> #include< ...
- struct socket 结构详解
Socket数据结构网络协议CC++ 用户使用socket系统调用编写应用程序时,通过一个数字来表示一个socket,所有的操作都在该数字上进行,这个数字称为套接字描述符.在系统调用 的实现函 ...
随机推荐
- Android(蓝牙)
因近期项目需求调试了Android蓝牙通讯接口,主要是两个终端作为服务端和客户端的通信,本文将部分重要知识点记录如下. 蓝牙是短距离无线通信,通常分经典蓝牙和低功耗蓝牙(即蓝牙4.0),两类蓝牙协议各 ...
- 使用SQL生成DateTime.Ticks
在项目中我需要使用到一个随机数(Random Number),该随机数将作为 Hashtable 中的 Key 用于唯一索引数据,所以需要保持单机唯一性. 同时该随机数还需要具备可排序性以便对数据进行 ...
- [.net 面向对象编程基础] (12) 面向对象三大特性——继承
[.net 面向对象编程基础] (12) 面向对象三大特性——继承 上节我们说了面向对象的三大特性之一的封装,解决了将对同一对象所能操作的所有信息放在一起,实现统一对外调用,实现了同一对象的复用,降低 ...
- 不插网线,看不到IP的解决办法
在Windows中,如果不插网线,就看不到IP地址,即使这个块网卡已经绑定了固定IP,原因是操作系统开启了DHCP Media Sense功能,该功能的作用如下: 在一台使用 TCP/IP 的基于 W ...
- 关于JavaScript内存泄漏的质疑
近几天看了些关于JavaScript内存管理的文章,相对于Java JVM的内存管理,显得简单些. 在学习的过程中,发现有不少网友谈到了循环引用,说循环引用会造成内存泄漏,垃圾回收器无法回收. 实际上 ...
- Spring-Context之四:Spring容器及bean的定义
Spring框架的核心功能之一就是控制反转(Inversion of Control, IoC),也叫做依赖注入(dependency injection, DI).关于依赖注入的具体内容可以参见Ma ...
- mac命令
mac下卸载nodesudo rm -rf /usr/local/{bin/{node,npm},lib/node_modules/npm,lib/node,share/man/*/node.*}xc ...
- Vuejs注意点
1.多级联动的时候,前一级变的时候,首先要把后面级的内容清空,要不然用户可能把前一次后面级的选择和新的前一级的选择提交(即后边级的列表渲染出来了,单但用户没有选择,此时vue绑定的是上一次的数据). ...
- Mybatis入门例子
Mybatis是轻量级的持久化框架,的确上手非常快. Mybatis大体上的思路就是由一个总的config文件配置全局的信息,比如mysql连接信息等.然后再mapper中指定查询的sql,以及参数和 ...
- Android开发学习之路-Service和Activity的通信
在很多时候,Service都不仅仅需要在后台运行,还需要和Activity进行通信,或者接受Activity的指挥,如何来实现,来看代码. 定义一个服务 // 创建一个服务,然后在onBind()中返 ...
注意