如何在不使用轮询的情况下检查非阻塞套接字是否断开连接?C#检查套接字是否断开连接?
6
A
回答
5
创建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 & 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
}
我刚刚实施了每个插座套接字关闭事件。所以你的应用程序应该为这个事件注册事件处理程序。那么套接字会通知你的应用程序,如果它本身是关闭的;)
如果代码有问题,通知我。
0
Socket
类有一个Connected
属性。根据MSDN,检查呼叫是非阻塞的。这不是你想要的吗?
+0
这是轮询解决方案 – 2011-04-18 04:38:26
+0
连接属性似乎总是如此,除非我自己断开套接字。我只是检查,即使套接字被远程服务器断开,它仍然返回true。 – Will 2011-04-18 04:39:22
相关问题
- 1. Python 3.5.1 - Asyncio - 检查套接字客户端是否已断开连接
- 2. 如何检测C中的套接字断开连接#
- 3. C#:套接字问题 - 几秒钟后连接的套接字断开连接
- 4. 无法断开连接并重新连接套接字(C++,winsock2)
- 5. 模拟套接字断开连接
- 6. 中断连接套接字
- 7. php套接字服务器检查客户端是否连接
- 8. 在WCF中检测套接字断开连接
- 9. Windws C++间歇性套接字断开连接
- 10. 重新连接断开连接的客户端套接字
- 11. C++ TCP检测客户端是否已断开连接数秒
- 12. Golang:如何检查会话是否连接/断开
- 13. 如何异步检查客户端是否断开连接?
- 14. 检查用户是否使用Flask断开连接
- 15. Perl套接字连接检查
- 16. 检查PHP套接字服务器中的断开连接客户端
- 17. 如何检测套接字断开?
- 18. 如果在读取字节之前断开连接,TCP套接字连接上的字节是否丢失?
- 19. 检查mongoDB是否连接
- 20. 是否为TCP套接字连接()块?
- 21. 测试套接字是否连接
- 22. socket.io断开连接事件,客户端断开连接检测
- 23. 检测jsch断开连接
- 24. 是否可以检查TCP连接是否断开而不写入它?
- 25. 套接字java断开
- 26. 套接字断开行为
- 27. C#-PHP套接字连接
- 28. c#套接字连接
- 29. C#套接字双连接?
- 30. 在C#中检测网络状态(连接 - 断开连接)
Socket.Connected不可实现 – Will 2011-04-18 04:48:33
在自定义类中实现的新的关联属性。尝试一下,它会奏效。 – 2011-04-18 04:53:02
Poll方法在linux上不起作用。即使套接字已关闭,它仍会继续返回false。这就是为什么我正在寻找一种不使用投票的方式。 – Will 2011-04-18 05:01:09