/// <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); }
/// <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); }
/// <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); } }