Итак, я знаю, что есть много статей по этой теме, и я прочитал много из них, я бы сказал, но по какой-то причине я уверен, что мой код не делает то, что должен делать.
Я хочу закрыть соединение между моим сервером и моим клиентом. Теперь на стороне сервера я запускаю отключение с помощью этого кода
public void shutdown()
{
_socket.Shutdown(SocketShutdown.Both);
_socket.Close();
}
И на стороне клиента у меня есть некоторые проблемы с пониманием того, как я получаю отключение, что, как мне кажется, происходит следующим образом: в моем асинхронном обратном вызове получения я должен получить ошибку, так как сервер начал последовательность выключения, и я должен справиться с этим (правильно ???) поэтому мой код для клиента выглядит так: ReceiveCallback:
private void ReceiveCallback(IAsyncResult result)
{
int bytesRecieved = 0;
byte[] tempBuff;
//Try to receive But if a Socket error occures disconnect otherwise start Receiving again
try
{
bytesRecieved = _socket.EndReceive(result);
}
catch (SocketException sockEx)
{
Disconnect(sockEx);
return;
}
catch (ObjectDisposedException disposeEx)
{
Disconnect(disposeEx);
return;
}
catch (Exception ex)
{
StartReceive();
return;
}
if (bytesRecieved == 0)
{
StartReceive();
return;
}
tempBuff = new byte[bytesRecieved];
Buffer.BlockCopy(_buffer, 0, tempBuff, 0, bytesRecieved);
StartReceive();
_packHandler.handlePacket(tempBuff);
}
Отключить:
public void Disconnect()
{
if (!_socket.Connected)
{
return;
}
_socket.BeginDisconnect(false, DisconnectCallback, null);
}
ОтключитьОбратный звонок
private void DisconnectCallback(IAsyncResult result)
{
_socket.EndDisconnect(result);
_socket.Close();
}
(Метод Disconnect перегружен, поэтому, если я получаю исключение, он выводит messageBox, а затем также вызывает Disconnect. Просто чтобы я знал, что произошло.)
Где я ошибаюсь и что я могу улучшить???
Я попробовал код, и он, похоже, сработал, но затем я посмотрел с помощью netstat, закрыты ли все сокеты, а клиентский сокет - нет. Это было в FIN_WAIT_2, что означает, что он (или сервер???) еще не отправил пакет FIN, верно? О, а потом я попробовал еще раз с этой измененной строкой:
if (bytesRecieved == 0)
{
StartReceive();
return;
}
TO
if (bytesRecieved == 0)
{
Disconnect;
return;
}
который затем выдал исключение на стороне сервера, а на стороне клиента клиент сказал, что соединение было закрыто сервером ???
РЕДАКТИРОВАТЬ: Даже когда я закрыл обе программы, Netstat по-прежнему показывает порт в состоянии ОЖИДАНИЯ. что это мне говорит?