コード例 #1
0
        private bool SendLights(CClient client)
        {
            CTcpData data = new CTcpData();

            //build up messages by appending to CTcpData
            data.SetData("lights " + client.m_lights.Count + "\n");

            for (int i = 0; i < client.m_lights.Count; i++)
            {
                data.SetData("light " + client.m_lights[i].Name + " ", true);

                data.SetData("scan ", true);
                data.SetData(client.m_lights[i].GetVscan()[0].ToString(Util.NumbersFormat) + " ", true);
                data.SetData(client.m_lights[i].GetVscan()[1].ToString(Util.NumbersFormat) + " ", true);
                data.SetData(client.m_lights[i].GetHscan()[0].ToString(Util.NumbersFormat) + " ", true);
                data.SetData(client.m_lights[i].GetHscan()[1].ToString(Util.NumbersFormat), true);
                data.SetData("\n", true);
            }

            if (client.m_socket.Write(data) != true)
            {
                Util.Log(client.m_socket.GetError());
                return(false);
            }
            return(true);
        }
コード例 #2
0
        private bool SendPing(CClient client)
        {
            int lightsused = 0;

            lock (m_mutex)
            {
                //check if any light is used
                for (int i = 0; i < client.m_lights.Count; i++)
                {
                    if (client.m_lights[i].GetNrUsers() > 0)
                    {
                        lightsused = 1;
                        break; //if one light is used we have enough info
                    }
                }
            }

            CTcpData data = new CTcpData();

            data.SetData("ping " + lightsused + "\n");

            if (client.m_socket.Write(data) != true)
            {
                Util.Log(client.m_socket.GetError());
                return(false);
            }
            return(true);
        }
コード例 #3
0
        internal bool Read(CTcpData data)
        {
            byte[] buff = new byte[1000];

            if (m_sock == null)
            {
                m_error = "socket closed";
                return(false);
            }

            bool returnv = WaitForSocket(false, "Read");//wait until the socket has something to read

            if (!returnv)
            {
                return(returnv);
            }

            //clear the tcpdata
            data.Clear();

            //loop until the socket has nothing more in its buffer
            while (true)
            {
                try
                {
                    int size = m_sock.Receive(buff, 0, buff.Length, SocketFlags.None, out SocketError errorCode); // recv(m_sock, buff, sizeof(buff), 0);

                    if (errorCode == SocketError.TryAgain && size == -1)                                          //we're done here, no more data, the call to WaitForSocket made sure there was at least some data to read
                    {
                        return(true);
                    }
                    else if (size == -1) //socket had an error
                    {
                        //m_error = "recv() " + m_address + ":" + m_port + " " + GetErrno();
                        return(false);
                    }
                    else if (size == 0 && data.GetSize() == 0) //socket closed and no data received
                    {
                        m_error = m_address + ":" + m_port + " Connection closed";
                        return(false);
                    }
                    else if (size == 0) //socket closed but data received
                    {
                        return(true);
                    }

                    data.SetData(buff, size, true); //append the data
                }
                catch (SocketException sockEx)
                {
                    m_error = "receive() " + m_address + ":" + m_port + " " + sockEx.NativeErrorCode + " " + sockEx.SocketErrorCode; //TODO: format this better
                    return(false);
                }
            }
        }
コード例 #4
0
        private bool ParseMessage(CClient client, CMessage message)
        {
            CTcpData data = new CTcpData();
            string   messagekey;

            //an empty message is invalid
            if (!Util.GetWord(ref message.message, out messagekey))
            {
                Util.LogError($"{client.m_socket.Address}:{client.m_socket.Port} sent gibberish");
                return(false);
            }

            if (messagekey == "hello")
            {
                Util.Log($"{client.m_socket.Address}:{client.m_socket.Port} said hello");
                data.SetData("hello\n");
                if (client.m_socket.Write(data) != true)
                {
                    Util.Log(client.m_socket.GetError());
                    return(false);
                }

                lock (m_mutex)
                {
                    if (client.m_connecttime == -1)
                    {
                        client.m_connecttime = message.time;
                    }
                }
            }
            else if (messagekey == "ping")
            {
                return(SendPing(client));
            }
            else if (messagekey == "get")
            {
                return(ParseGet(client, message));
            }
            else if (messagekey == "set")
            {
                return(ParseSet(client, message));
            }
            else if (messagekey == "sync")
            {
                return(ParseSync(client));
            }
            else
            {
                Util.LogError($"{client.m_socket.Address}:{client.m_socket.Port} sent gibberish");
                return(false);
            }

            return(true);
        }
コード例 #5
0
        private bool SendVersion(CClient client)
        {
            CTcpData data = new CTcpData();

            data.SetData("version " + ProtocolVersion.Version + "\n");

            if (client.m_socket.Write(data) != true)
            {
                Util.Log(client.m_socket.GetError());
                return(false);
            }
            return(true);
        }
コード例 #6
0
        private void AddClient(CClient client)
        {
            //TODO: google this
            const int FD_SETSIZE = 100;

            lock (m_mutex)
            {
                if (m_clients.Count >= FD_SETSIZE) //maximum number of clients reached
                {
                    Util.LogError($"number of clients reached maximum {FD_SETSIZE}");
                    CTcpData data = new CTcpData();
                    data.SetData("full\n");
                    client.m_socket.Write(data);
                    client = null;
                    return;
                }

                //assign lights and put the pointer in the clients vector
                client.InitLights(m_lights);
                m_clients.Add(client);
            }
        }