예제 #1
0
        public override bool DoSendResultSmell()
        {
            string commandText = m_outgoingDataAssembler.GetProtocolText();

            byte[] bufferUTF8  = str2HexByte(commandText);
            int    totalLength = bufferUTF8.Length; //获取总大小
            AsyncSendBufferManager asyncSendBufferManager = m_asyncSocketUserToken.SendBuffer;

            asyncSendBufferManager.StartPacket();
            // asyncSendBufferManager.DynamicBufferManager.WriteInt(totalLength, false); //写入总大小
            asyncSendBufferManager.DynamicBufferManager.WriteBuffer(bufferUTF8, 0, totalLength);

            asyncSendBufferManager.EndPacket();

            bool result = true;

            if (!m_asyncSocketUserToken.SendAsyncState)
            {
                int packetOffset = 0;
                int packetCount  = 0;
                if (asyncSendBufferManager.GetFirstPacket(ref packetOffset, ref packetCount))
                {
                    m_asyncSocketUserToken.SendAsyncState = true;
                    m_asyncSocketUserToken.SendAsyncState = true;
                    result = m_asyncSocketServer.SendAsyncEvent(m_asyncSocketUserToken.ConnectSocket, m_asyncSocketUserToken.SendEventArgs,
                                                                asyncSendBufferManager.DynamicBufferManager.Buffer, packetOffset, packetCount);
                }
            }
            return(result);
        }
예제 #2
0
        public void MonitorSocketStart(object source, System.Timers.ElapsedEventArgs e)
        {
            //轮巡SOCKET管理类,查数据接收超时
            AsyncSocketUserToken[] ListSoc = null;
            m_asyncSocketServer.AsyncSocketUserTokenList.CopyList(ref ListSoc);

            for (int i = 0; i < ListSoc.Length; i++)
            {
                try
                {
                    //SOCKET不为空,则可以发送消息
                    if (ListSoc[i].ConnectSocket != null)
                    {
                        //   Console.WriteLine("{0} is time out!!!", ListSoc[i].ConnectSocket.ToString());
                        //   //todo 服务器主动断掉这个链接,其他操作待添加
                        if (ListSoc[i].AsyncSocketInvokeElement != null)
                        {
                            ///当前端口发送不冲突

                            //byte[] bufferUTF8 = str2HexByte(ListSoc[i].StrQueryCommand);
                            byte[] bufferUTF8 = str2HexByte("01030000F1D8");

                            AsyncSendBufferManager asyncSendBufferManager = ListSoc[i].SendBuffer;
                            asyncSendBufferManager.StartPacket();
                            // asyncSendBufferManager.DynamicBufferManager.WriteInt(totalLength, false); //写入总大小
                            asyncSendBufferManager.DynamicBufferManager.WriteBuffer(bufferUTF8, 0, bufferUTF8.Length);

                            asyncSendBufferManager.EndPacket();
                            //
                            bool result = true;
                            //      Console.WriteLine("ListSoc[i].SendAsyncState = ?" + ListSoc[i].SendAsyncState);
                            //如果发送端口被占有
                            while (ListSoc[i].SendAsyncState)
                            {
                                Thread.Sleep(100);
                                Console.WriteLine("sleep 100");
                            }

                            int packetOffset = 0;
                            int packetCount  = 0;
                            if (asyncSendBufferManager.GetFirstPacket(ref packetOffset, ref packetCount))
                            {
                                ListSoc[i].SendAsyncState = true;
                                //    Console.WriteLine(System.DateTime.Now + "ListSoc[i].SendAsyncState = true;");
                                Program.Logger.Debug(System.DateTime.Now + "send:" + bufferUTF8);
                                result = m_asyncSocketServer.SendAsyncEvent(ListSoc[i].ConnectSocket,
                                                                            ListSoc[i].SendEventArgs,
                                                                            asyncSendBufferManager.DynamicBufferManager.Buffer, packetOffset,
                                                                            packetCount);
                            }
                        }
                    }
                    Thread.Sleep(100);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("##############" + ex);
                }
            }
        }
        public bool send()
        {
            AsyncSendBufferManager sendBufferManager = userToken.AsyncSendBufferManager;
            string data = sendData.getSendData();

            byte[] sendByte = FormatHelper.GetBytesFromGBKString(data);
            sendBufferManager.startPacket();
            sendBufferManager.DynamicBufferManager.writeBuffer(sendByte);
            sendBufferManager.endPacket();
            bool result = true;

            if (!isSending)
            {
                int packetOffset = 0;
                int packetCount  = 0;
                if (sendBufferManager.getFirstPacket(ref packetOffset, ref packetCount))
                {
                    isSending = true;
                    //每一次发送时,更新时间
                    userToken.ActiveDateTime = DateTime.Now;
                    result = server.sendAsyncEvent(userToken.ConnectedSocket,
                                                   userToken.SendAysncEvetnArgs, sendBufferManager.DynamicBufferManager.Buffer, packetOffset, packetCount);
                }
            }
            return(result);
        }
        public bool sendComplete()
        {
            AsyncSendBufferManager sendBufferManager = userToken.AsyncSendBufferManager;

            sendBufferManager.clearFirstPacket();
            isSending = false;
            int packetOffset = 0;
            int packetCount  = 0;

            if (sendBufferManager.getFirstPacket(ref packetOffset, ref packetCount))
            {
                isSending = true;
                return(server.sendAsyncEvent(userToken.ConnectedSocket,
                                             userToken.SendAysncEvetnArgs, sendBufferManager.DynamicBufferManager.Buffer, packetOffset, packetCount));
            }
            else
            {
                return(sendCallBack());
            }
        }
        public AsyncSocketUserToken(int receiveBufferSize)
        {
            this.connectedSocket       = null;
            this.receiveAysncEventArgs = new SocketAsyncEventArgs();
            //此处一定要为receiveAsyncEventArgs设置一个缓冲区,否则会一直出现System.NullReferenceException: 未将对象引用设置到对象的实例
            //ps:解决此问题的网址为http://www.cnblogs.com/jzywh/archive/2011/12/28/SuperSocket1_4SP2.html#2693439
            //byte[] buffer = new byte[1024];
            asyncReceiveBuffer = new byte[receiveBufferSize];
            this.receiveAysncEventArgs.SetBuffer(asyncReceiveBuffer, 0, asyncReceiveBuffer.Length);
            this.receiveAysncEventArgs.UserToken = this;

            this.sendAysncEventArgs           = new SocketAsyncEventArgs();
            this.sendAysncEventArgs.UserToken = this;

            dynamicBufferManager = new DynamicBufferManager(ProtocolConst.InitBufferSize);

            asyncSendBufferManager = new AsyncSendBufferManager(ProtocolConst.InitBufferSize);

            invokeElement = null;
            DeviceInfo    = null;
        }
        public bool send(byte[] buffer, int offset, int length)
        {
            string info = "";

            if (userToken.DeviceInfo != null)
            {
                info = string.Format("向DTU客户端(序号为:{0})发送数据,十六进制表示为:{1}", userToken.DeviceInfo.SerialString, FormatHelper.ByteArrayToHexString(buffer, offset, length));
            }
            else
            {
                info = string.Format("向DTU客户端发送数据,十六进制表示为:{0}", FormatHelper.ByteArrayToHexString(buffer, offset, length));
            }
            ShowLogData.add(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":[" + userToken.ConnectedSocket.RemoteEndPoint.ToString() + "]发送:" + info);
            LogHelper.Info(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":[" + userToken.ConnectedSocket.RemoteEndPoint.ToString() + "]发送:" + info);

            AsyncSendBufferManager sendBufferManager = userToken.AsyncSendBufferManager;

            sendBufferManager.startPacket();
            sendBufferManager.DynamicBufferManager.writeBuffer(buffer, offset, length);
            sendBufferManager.endPacket();
            bool result = true;

            if (!isSending)
            {
                int packetOffset = 0;
                int packetCount  = 0;
                if (sendBufferManager.getFirstPacket(ref packetOffset, ref packetCount))
                {
                    isSending = true;
                    //每一次发送时,更新时间
                    userToken.ActiveDateTime = DateTime.Now;
                    result = server.sendAsyncEvent(userToken.ConnectedSocket,
                                                   userToken.SendAysncEvetnArgs, sendBufferManager.DynamicBufferManager.Buffer, packetOffset, packetCount);
                }
            }
            return(result);
        }