Exemplo n.º 1
0
    ///<summary>Destroys alive websocket connections with the sessionId</summary>
    public static bool SearchAndDestroy(string sessionId)
    {
        if (sessionId is null)
        {
            return(false);
        }

        List <WebSocket> remove = new List <WebSocket>();

        foreach (DictionaryEntry e in connections)
        {
            AliveEntry entry = (AliveEntry)e.Value;
            if (entry.session == sessionId)
            {
                remove.Add(entry.ws);
                if (entry.ws.State == WebSocketState.Open)
                {
                    try {
                        entry.ws.SendAsync(MSG_FORCE_RELOAD, WebSocketMessageType.Text, true, CancellationToken.None);
                    } catch { }
                    try {
                        entry.ws.Abort();
                    } catch { }
                }
            }
        }

        for (int i = 0; i < remove.Count; i++)
        {
            connections.Remove(remove[i]);
        }
        remove.Clear();

        return(true);
    }
Exemplo n.º 2
0
    public static void Broadcast(byte[] message)
    {
        List <WebSocket> remove = new List <WebSocket>();

        foreach (DictionaryEntry e in connections)
        {
            AliveEntry entry = (AliveEntry)e.Value;

            if (!Session.acl.ContainsKey(entry.username))
            {
                remove.Add(entry.ws);
                continue;
            }

            AccessControl ac = Session.acl[entry.username];

            if (ac is null ||
                ac.database == AccessControl.AccessLevel.Deny ||
                ac.log == AccessControl.AccessLevel.Deny) //broadcast only to authorized users
            {
                continue;
            }

            if (entry.ws.State == WebSocketState.Open)
            {
                new Thread(() => {
                    try {
                        lock (entry.syncLock)
                            entry.ws.SendAsync(new ArraySegment <byte>(message, 0, message.Length), WebSocketMessageType.Text, true, CancellationToken.None);
                    } catch {}
                }).Start();
            }

            else
            {
                remove.Add(entry.ws);
            }
        }

        for (int i = 0; i < remove.Count; i++)
        {
            connections.Remove(remove[i]);
        }
    }