示例#1
0
        /// <summary>
        /// NET_SendUnreliableMessage
        /// returns 0 if the message connot be delivered reliably, but the connection
        ///		is still considered valid
        /// returns 1 if the message was sent properly
        /// returns -1 if the connection died
        /// </summary>
        public static int SendUnreliableMessage(qsocket_t sock, MsgWriter data)
        {
            if (sock == null)
            {
                return(-1);
            }

            if (sock.disconnected)
            {
                Con.Print("NET_SendMessage: disconnected socket\n");
                return(-1);
            }

            SetNetTime();

            int r = _Drivers[sock.driver].SendUnreliableMessage(sock, data);

            if (r == 1 && sock.driver != 0)
            {
                _UnreliableMessagesSent++;
            }

            if (_IsRecording)
            {
                _VcrSendMessage.time    = Host.Time;
                _VcrSendMessage.op      = VcrOp.VCR_OP_SENDMESSAGE;
                _VcrSendMessage.session = 1;// (long)sock; Uze todo: ???????
                _VcrSendMessage.ret     = r;
                byte[] buf = Sys.StructureToBytes(ref _VcrSendMessage);
                Host.VcrWriter.Write(buf);
            }

            return(r);
        }
示例#2
0
        /// <summary>
        /// NET_CanSendMessage
        /// Returns true or false if the given qsocket can currently accept a
        /// message to be transmitted.
        /// </summary>
        public static bool CanSendMessage(qsocket_t sock)
        {
            if (sock == null)
            {
                return(false);
            }

            if (sock.disconnected)
            {
                return(false);
            }

            SetNetTime();

            bool r = _Drivers[sock.driver].CanSendMessage(sock);

            if (_IsRecording)
            {
                _VcrSendMessage.time    = Host.Time;
                _VcrSendMessage.op      = VcrOp.VCR_OP_CANSENDMESSAGE;
                _VcrSendMessage.session = 1; // (long)sock; Uze: todo: do something?
                _VcrSendMessage.ret     = r ? 1 : 0;
                byte[] buf = Sys.StructureToBytes(ref _VcrSendMessage);
                Host.VcrWriter.Write(buf, 0, buf.Length);
            }

            return(r);
        }
示例#3
0
        /// <summary>
        /// NET_CheckNewConnections
        /// </summary>
        /// <returns></returns>
        public static qsocket_t CheckNewConnections()
        {
            SetNetTime();

            for (_DriverLevel = 0; _DriverLevel < _Drivers.Length; _DriverLevel++)
            {
                if (!_Drivers[_DriverLevel].IsInitialized)
                {
                    continue;
                }

                if (_DriverLevel > 0 && !_IsListening)
                {
                    continue;
                }

                qsocket_t ret = Net.Driver.CheckNewConnections();
                if (ret != null)
                {
                    if (_IsRecording)
                    {
                        _VcrConnect.time    = Host.Time;
                        _VcrConnect.op      = VcrOp.VCR_OP_CONNECT;
                        _VcrConnect.session = 1; // (long)ret; // Uze: todo: make it work on 64bit systems
                        byte[] buf = Sys.StructureToBytes(ref _VcrConnect);
                        Host.VcrWriter.Write(buf, 0, buf.Length);
                        buf = Encoding.ASCII.GetBytes(ret.address);
                        int count = Math.Min(buf.Length, NET_NAMELEN);
                        int extra = NET_NAMELEN - count;
                        Host.VcrWriter.Write(buf, 0, count);
                        for (int i = 0; i < extra; i++)
                        {
                            Host.VcrWriter.Write((byte)0);
                        }
                    }
                    return(ret);
                }
            }

            if (_IsRecording)
            {
                _VcrConnect.time    = Host.Time;
                _VcrConnect.op      = VcrOp.VCR_OP_CONNECT;
                _VcrConnect.session = 0;
                byte[] buf = Sys.StructureToBytes(ref _VcrConnect);
                Host.VcrWriter.Write(buf, 0, buf.Length);
            }

            return(null);
        }
示例#4
0
        /// <summary>
        /// NET_GetMessage
        /// returns data in net_message sizebuf
        /// returns 0 if no data is waiting
        /// returns 1 if a message was received
        /// returns 2 if an unreliable message was received
        /// returns -1 if the connection died
        /// </summary>
        public static int GetMessage(qsocket_t sock)
        {
            //int ret;

            if (sock == null)
            {
                return(-1);
            }

            if (sock.disconnected)
            {
                Con.Print("NET_GetMessage: disconnected socket\n");
                return(-1);
            }

            SetNetTime();

            int ret = _Drivers[sock.driver].GetMessage(sock);

            // see if this connection has timed out
            if (ret == 0 && sock.driver != 0)
            {
                if (_Time - sock.lastMessageTime > _MessageTimeout.Value)
                {
                    Close(sock);
                    return(-1);
                }
            }

            if (ret > 0)
            {
                if (sock.driver != 0)
                {
                    sock.lastMessageTime = _Time;
                    if (ret == 1)
                    {
                        _MessagesReceived++;
                    }
                    else if (ret == 2)
                    {
                        _UnreliableMessagesReceived++;
                    }
                }

                if (_IsRecording)
                {
                    _VcrGetMessage.time    = Host.Time;
                    _VcrGetMessage.op      = VcrOp.VCR_OP_GETMESSAGE;
                    _VcrGetMessage.session = 1;// (long)sock; Uze todo: write somethisng meaningful
                    _VcrGetMessage.ret     = ret;
                    byte[] buf = Sys.StructureToBytes(ref _VcrGetMessage);
                    Host.VcrWriter.Write(buf, 0, buf.Length);
                    Host.VcrWriter.Write(Net.Message.Length);
                    Host.VcrWriter.Write(Net.Message.Data, 0, Net.Message.Length);
                }
            }
            else
            {
                if (_IsRecording)
                {
                    _VcrGetMessage.time    = Host.Time;
                    _VcrGetMessage.op      = VcrOp.VCR_OP_GETMESSAGE;
                    _VcrGetMessage.session = 1; // (long)sock; Uze todo: fix this
                    _VcrGetMessage.ret     = ret;
                    byte[] buf = Sys.StructureToBytes(ref _VcrGetMessage);
                    Host.VcrWriter.Write(buf, 0, buf.Length);
                }
            }

            return(ret);
        }