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,所有的操作都在该数字上进行,这个数字称为套接字描述符.在系统调用 的实现函 ...
随机推荐
- Cloneable接口和Object的clone()方法
为什么要克隆 为什么要使用克隆,这其实反映的是一个很现实的问题,假如我们有一个对象: public class SimpleObject implements Cloneable { private ...
- SVM-线性可分支持向量机
SVM-线性可分支持向量机 如果您想体验更好的阅读:请戳这里littlefish.top 函数间隔和几何间隔 给定线性可分训练数据集,通过间隔最大化或等价地求解相应的凸二次规划问题学习得到的分离超平面 ...
- 内存角度探寻C++面向对象 之 继承、多态
一,简单继承: #include <iostream> class TableTennisPlayer { private: int id; public: TableTennisPlay ...
- vue初体验:实现一个增删查改成绩单
前端变化层出不穷,去年NG火一片,今年react,vue火一片,ng硬着头皮看了几套教程,总被其中的概念绕晕,react是faceback出品,正在不断学习中,同时抽时间了解了vue,查看了vue官方 ...
- Yii2框架RESTful API教程(一) - 快速入门
前不久做一个项目,是用Yii2框架写一套RESTful风格的API,就去查了下<Yii 2.0 权威指南 >,发现上面写得比较简略.所以就在这里写一篇教程贴,希望帮助刚接触Yii2框架RE ...
- SVN命令模式批量更新多个项目
使用svn作为版本管理是,在一个仓库下边同时建立多个项目,每天上班都需要一个个更新,为了发挥程序员懒的精神,能让电脑做的,绝不手工操作.作为自动化处理,在windows环境,首先想到了bat Tort ...
- Android入门(十九)WebView
原文链接:http://www.orlion.ga/676/ WebView可以在自己的应用程序中嵌入一个浏览器来展示网页. 创建一个项目WebViewDemo,修改activity_main.xml ...
- javascript类型系统——日期Date对象
× 目录 [1]静态方法 [2]构造函数 [3]实例方法 前面的话 Date对象是javascript语言中内置的数据类型,用于提供日期和时间的操作接口.Date对象是在早期java中的java.ut ...
- List和Dictionary泛型类查找效率浅析
List和Dictionary泛型类查找效率存在巨大差异,前段时间亲历了一次.事情的背景是开发一个匹配程序,将书籍(BookID)推荐给网友(UserID),生成今日推荐数据时,有条规则是同一书籍七日 ...
- Java多线程系列--“基础篇”02之 常用的实现多线程的两种方式
概要 本章,我们学习“常用的实现多线程的2种方式”:Thread 和 Runnable.之所以说是常用的,是因为通过还可以通过java.util.concurrent包中的线程池来实现多线程.关于线程 ...
注意