关闭套接字时读取网络流

时间:2019-01-17 03:54:48

标签: c# networkstream

这个问题很简单。阅读documentation about NetworkStream Read,然后引用:

  

返回   32位   从NetworkStream读取的字节数;如果套接字已关闭,则为0。

以后

  

IOException   基础Socket已关闭。

哪个是真的?显然两者不能同时为真,必须有所区别。 (似乎前者是真的)

1 个答案:

答案 0 :(得分:3)

两者

如果在调用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);