Сетевой поток читается, когда сокет закрыт - PullRequest
0 голосов
/ 17 января 2019

Этот вопрос очень прост. Прочитайте документацию о NetworkStream Read , и я цитирую:

Возвращает Int32 Количество байтов, прочитанных из NetworkStream, или 0, если сокет закрыт.

и позже

IOException Основное гнездо закрыто.

Что является правдой? Очевидно, что оба не могут быть правдой одновременно, должна быть разница. (Похоже, что первое верно)

1 Ответ

0 голосов
/ 17 января 2019

Оба

Если клиентский сокет (который связан с NetworkStream) закрыт перед вызовом Read, он вызывает исключение ввода-вывода.

Если сокет сервера закрыт во время (или раньше) 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);
...