【发布时间】:2019-01-17 03:54:48
【问题描述】:
这个问题很简单。阅读documentation about NetworkStream Read 并引用:
返回 整数32 从 NetworkStream 读取的字节数,如果套接字关闭,则为 0。
后来
IO异常 底层 Socket 已关闭。
哪个是真的?显然两者不能同时为真,一定有区别。 (看来前者是真的)
【问题讨论】:
标签: c# networkstream
这个问题很简单。阅读documentation about NetworkStream Read 并引用:
返回 整数32 从 NetworkStream 读取的字节数,如果套接字关闭,则为 0。
后来
IO异常 底层 Socket 已关闭。
哪个是真的?显然两者不能同时为真,一定有区别。 (看来前者是真的)
【问题讨论】:
标签: c# networkstream
两者
如果 客户端套接字(与 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);
【讨论】: