c# - 套接字关闭时读取的网络流
问题描述
这个问题很简单。阅读有关 NetworkStream Read的文档,我引用:
返回 Int32 从 NetworkStream 读取的字节数,如果套接字关闭,则返回 0。
然后
IOException 底层 Socket 已关闭。
哪个是真的?显然两者不能同时为真,一定有区别。(看来前者是真的)
解决方案
两个都
如果客户端套接字(与 绑定NetworkStream
)在您调用之前关闭Read
,则会引发 IO 异常。
如果服务器套接字在 期间(或之前)关闭Read
,它可能返回 0,这意味着服务器没有发送任何内容。
一些例子:
var server = new Socket(SocketType.Stream, ProtocolType.Tcp);
var client = new Socket(SocketType.Stream, ProtocolType.Tcp);
/* Init the server socket */
server.Bind(new IPEndPoint(IPAddress.Any, 19998));
server.Listen(50);
server.BeginAccept(ar =>
{
var server2 = server.EndAccept(ar);
//server2.Close(); // Read will return 0
},
null);
/* Init the client socket */
client.Connect(IPAddress.Loopback, 19998);
NetworkStream stream = new NetworkStream(client);
//client.Close(); // Read will throw IOException
var buf = new byte[128];
int read = stream.Read(buf, 0, 128);
推荐阅读
- javascript - Math.pow 在 calc 中返回 0
- android - 如何在 ionic 2 中实现 In App Purcharse?
- javascript - For循环和2个数组
- spring - Spring:如何从数据库中显示百里香中的图像
- php - 调用未定义的方法 Illuminate\Database\Query\Builder::appends() 错误
- javascript - 无法 console.log 获取结果
- python - 无限期地绘制matplotlib子图?
- docker - pycharm错误运行,在docker debug上找不到运行器
- google-bigquery - Scio saveAsTypedBigQuery 写入分区,用于 SCollection of Typed Big Query 案例类
- c - 静态内存可以延迟分配吗?