#c# #events #sockets #polling
#c# #Мероприятия #сокеты #опрос
Вопрос:
Как вы можете проверить, отключен ли неблокирующий сокет без использования опроса?
Ответ №1:
Создайте класс сокета cusomt, наследующий класс сокета .net :
public delegate void SocketEventHandler(Socket socket);
public class CustomSocket : Socket
{
private readonly Timer timer;
private const int INTERVAL = 1000;
public CustomSocket(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType)
: base(addressFamily, socketType, protocolType)
{
timer = new Timer { Interval = INTERVAL };
timer.Tick = TimerTick;
}
public CustomSocket(SocketInformation socketInformation)
: base(socketInformation)
{
timer = new Timer { Interval = INTERVAL };
timer.Tick = TimerTick;
}
private readonly List<SocketEventHandler> onCloseHandlers = new List<SocketEventHandler>();
public event SocketEventHandler SocketClosed
{
add { onCloseHandlers.Add(value); }
remove { onCloseHandlers.Remove(value); }
}
public bool EventsEnabled
{
set
{
if(value)
timer.Start();
else
timer.Stop();
}
}
private void TimerTick(object sender, EventArgs e)
{
if (!Connected)
{
foreach (var socketEventHandler in onCloseHandlers)
socketEventHandler.Invoke(this);
EventsEnabled = false;
}
}
// Hiding base connected property
public new bool Connected
{
get
{
bool part1 = Poll(1000, SelectMode.SelectRead);
bool part2 = (Available == 0);
if (part1 amp; part2)
return false;
else
return true;
}
}
}
Затем используйте его следующим образом :
var socket = new CustomSocket(
//parameters
);
socket.SocketClosed = socket_SocketClosed;
socket.EventsEnabled = true;
void socket_SocketClosed(Socket socket)
{
// do what you want
}
Я только что реализовал событие закрытия сокета в каждом сокете. итак, ваше приложение должно зарегистрировать обработчики событий для этого события. затем сокет сообщит вашему приложению, было ли оно закрыто само 😉
если были какие-либо проблемы с кодом, сообщите мне.
Комментарии:
1. Сокет. Подключение невозможно
2. новое свойство Connected реализовано в пользовательском классе. попробуйте, это сработает.
3. Метод опроса не работает в Linux. Даже когда сокет закрыт, он будет продолжать возвращать false. Вот почему я ищу способ без использования опроса.
4. вы хотите использовать этот метод в mono? Я отредактировал ответ, чтобы остановить распространение событий после закрытия сокета. Метод опроса работает у меня в Windows. Я не знаю, где вы хотите это использовать.
5. Это работает в Windows с mono, но в Linux с mono этого не происходит.
Ответ №2:
У Socket
класса есть Connected
свойство. Согласно MSDN, вызов для проверки неблокирующий. Это не то, что вы ищете?
Комментарии:
1. Свойство Connected всегда кажется истинным, если я сам не отключу сокет. Я только что проверил, и даже несмотря на то, что сокет был отключен удаленным сервером, он все равно возвращает true.