예제 #1
0
        /// <summary>
        /// 方法重载
        /// </summary>
        /// <param name="example"></param>
        /// <param name="data"></param>
        /// <param name="msgid">用以实现自定义模式的包编号</param>
        /// <returns></returns>
        public static byte AddRequire(Compare example, object data, int msgid)
        {
            //根据destID获取目标主机的IP和port,这里如果发送多个数据需多次跟数据库通信
            //麻烦,所以可以一次性将ip和port读到数据字典
            IPEndPoint endpointtemp = Define.id_ip_port[example.destID];
            PacketRet  pr           = Packetization(example, data, msgid);

            //加入发送队列
            Define.SendQueueItem sqi = new Define.SendQueueItem();
            sqi.destpoint = endpointtemp;
            sqi.senddata  = pr.packetdata;
            Define.send_queue.Enqueue(sqi);
            //如果是一帧中的第一包
            //计时队列和摘要队列是一次添加,内容不变化
            //这里存在安全隐患:关联于队列中暂留项目的冲突可能性
            if (!Define.index_obj.ContainsKey(pr.packetnum))
            {
                //加入计时队列 TimerTick.count初始为30
                Define.existime.Add(pr.packetnum, TimerTick.count);
                //加入发送缓存队列
                Define.index_obj.Add(pr.packetnum, data);
                //加入到摘要队列
                Define.index_com.Add(pr.packetnum, example);
            }
            //针对一帧多包,一帧中的后续包
            else
            {
                //更新发送缓冲队列
                Define.index_obj[pr.packetnum] = data;
            }
            return(pr.packetnum);
        }
예제 #2
0
        /// <summary>
        /// 将发送的数据帧添加到发送缓冲队列
        /// </summary>
        /// <param name="example"></param>
        /// <param name="data"></param>
        /// <param name="donewrite">仅针对于文件的写,且是分多次写下的情况</param>
        public static byte AddRequire(Compare example, object data)
        {
            //根据destID获取目标主机的IP和port,这里如果发送多个数据需多次跟数据库通信
            //麻烦,所以可以一次性将ip和port读到数据字典
            IPEndPoint endpointtemp = new IPEndPoint(IPAddress.Parse(MyDictionary.ID_IP[example.destID]),
                                                     MyDictionary.ID_PORT[example.destID]);
            PacketRet pr = Packetization(example, data);

            //加入发送队列
            Define.SendQueueItem sqi = new Define.SendQueueItem();
            sqi.destpoint = endpointtemp;
            sqi.senddata  = pr.packetdata;
            Define.send_queue.Enqueue(sqi);
            //如果是一帧中的第一包
            //计时队列和摘要队列是一次添加,内容不变化
            if (!Define.index_obj.ContainsKey(pr.packetnum))
            {
                //加入计时队列 TimerTick.count初始为30
                Define.existime.Add(pr.packetnum, TimerTick.count);
                //加入发送缓存队列
                Define.index_obj.Add(pr.packetnum, data);
                //加入到摘要队列
                Define.index_com.Add(pr.packetnum, example);
            }
            //针对一帧多包,一帧中的后续包
            else
            {
                //更新发送缓冲队列
                Define.index_obj[pr.packetnum] = data;
            }
            return(pr.packetnum);
        }
예제 #3
0
파일: IMServerUDP.cs 프로젝트: athree/YSP
        /// <summary>
        /// 发送UDP消息, 为独立的线程,循环检测发送标志位
        /// 不间断的检测,考虑是否添加延迟(在lock外部添加)
        /// !注意:需加传入参数或者通过共享缓冲区
        /// </summary>
        //public void SendMsg()
        //{
        //    for (; ; )
        //    {
        //        if (true == shared.udpsendflag)
        //        {
        //            //MessageBox.Show("后台检测到有数据要发送");
        //            //线程锁操作,这里对值类型变量进行锁操作,考虑变量情况
        //            shared.udpsendflag = false;
        //            ///打包发送将要发送的数据帧
        //            int sendcount = shared.listenfd.SendTo(shared.sendbuffer, shared.remotepoint);
        //            //已经发送,开始计时
        //            this.StartTimer();
        //            //MessageBox.Show("发送了" + sendcount.ToString() + "!!!");
        //            //发送完成,置位,考虑添加发送异常处理,在异常时则不能接受
        //            shared.udprecvflag = true;
        //        }
        //        //防止过劳
        //        Thread.Sleep(50);
        //    }
        //}

        /// <summary>
        /// 扫描发送队列发送,间隔一定的时间
        /// </summary>
        /// <param name="diff"></param>
        public void SendMsg()
        {
            for (;;)
            {
                if (Define.send_queue.Count != 0)
                {
                    Define.SendQueueItem temp = Define.send_queue.Dequeue();
                    //这里设置为-1,一直等待到套接口可写
                    if (shared.listenfd.Poll(-1, SelectMode.SelectWrite))
                    {
                        shared.listenfd.SendTo(temp.senddata, temp.destpoint);
                        //history.AppendText("新发出一条消息!\r\n");
                    }
                    else
                    {
                        //MessageBox.Show("IMServerUDP:使用poll函数等待套接口可写以便发送失败!");
                    }
                }
                //每隔500ms扫描一次套接口是否可写
                Thread.Sleep(500);
            }
        }