C# 在C中向.NET套接字添加事件#
我有一个CustomSocket类,它扩展了Socket,该Socket添加事件以获取有关客户端断开与服务器连接的反馈。我想知道如果_listenerSocket.Accept()方法返回一个套接字而不是包含事件的CustomSocket类,如何将我的client disconnect方法添加到事件委托中??代码如下C# 在C中向.NET套接字添加事件#,c#,sockets,events,C#,Sockets,Events,我有一个CustomSocket类,它扩展了Socket,该Socket添加事件以获取有关客户端断开与服务器连接的反馈。我想知道如果_listenerSocket.Accept()方法返回一个套接字而不是包含事件的CustomSocket类,如何将我的client disconnect方法添加到事件委托中??代码如下 public class CustomSocket : Socket { private readonly Timer timer; private cons
public class CustomSocket : Socket
{
private readonly Timer timer;
private const int INTERVAL = 1000;
public delegate void SocketEventHandler(Socket socket);
public CustomSocket(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType) : base(addressFamily, socketType, protocolType)
{
timer = new Timer { Interval = INTERVAL };
timer.Elapsed += TimerTick;
}
public CustomSocket(SocketInformation socketInformation) : base(socketInformation)
{
timer = new Timer { Interval = INTERVAL };
timer.Elapsed += 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;
}
}
}
我试过这个
static void ListenThread()
{
try
{
for (; ; )
{
_listenerSocket.Listen(5);
CustomSocket cs = (CustomSocket) _listenerSocket.Accept();
_clients.Add(new ClientData(cs));
cs.SocketClosed += CsOnSocketClosed;
}
}
catch
{
//
}
}
但我会有铸造错误等。。
任何帮助都将不胜感激
Matt您不能将套接字强制转换为自定义套接字。因为Accept返回套接字而不是CustomSocket 您可以将套接字封装在CustomSocket中,CustomSocket将套接字作为这样的参数来解决您的问题
class CustomSocket
{
private Socket _socket;
public Socket Socket
{
get
{
return _socket;
}
}
public CustomSocket(Socket s)
{
_socket = s;
}
}
由于
Accept()
方法永远不会返回您自己类的实例,因此您肯定需要使用组合而不是继承。请参阅现有的套接字包装器,如TcpClient
,NetworkStream
,以获取灵感。这里没有足够的细节,无法提供有关如何编写套接字
实例的具体指导。但是,对于具体处理Accept()
方法场景,它将如下所示:
class CustomSocket
{
private Socket _socket;
public CustomSocket(Socket socket)
{
_socket = socket;
}
public CustomSocket Accept()
{
return new CustomSocket(_socket.Accept());
}
}
最后,现在还不完全清楚对Socket
类进行子分类/包装的总体目标是什么,但是到目前为止,您发布的代码看起来像是试图在Socket
类上抽象轮询机制
但是轮询一个
套接字是使用它的最低效的方法,而且是不必要的。您可能会发现,通过将异步模型与Socket
(例如Socket.beginacept()
,…BeginRead()
,等等)一起使用,您不需要抽象任何内容,并且可以直接使用Socket
类。是否要发布准确的错误消息?。。。并在代码中指出何时发生强制转换(和其他)错误?以下是异常的副本+$exception{“无法将'System.Net.Sockets.Socket'类型的对象强制转换为'ServerApp.CustomSocket'。“}System.exception{System.InvalidCastException}在我的项目中,当客户端连接到服务器时,我试图将节点添加到树视图中,然后在断开连接时删除节点。将有多个客户端连接到套接字,因此我认为需要捕获来自套接字对象的事件,该对象从socket.Accept()传回;方法
class CustomSocket
{
private Socket _socket;
public CustomSocket(Socket socket)
{
_socket = socket;
}
public CustomSocket Accept()
{
return new CustomSocket(_socket.Accept());
}
}