Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中向.NET套接字添加事件#_C#_Sockets_Events - Fatal编程技术网

C# 在C中向.NET套接字添加事件#

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

我有一个CustomSocket类,它扩展了Socket,该Socket添加事件以获取有关客户端断开与服务器连接的反馈。我想知道如果_listenerSocket.Accept()方法返回一个套接字而不是包含事件的CustomSocket类,如何将我的client disconnect方法添加到事件委托中??代码如下

   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());
    }
}