zoukankan      html  css  js  c++  java
  • UDP 一个封锁操作被对 WSACancelBlockingCall 的调用中断

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Net.Sockets;
    using System.Net;
    using Common;
    using System.Threading;
    using System.IO;
     
    namespace BLL
    {
       public class SocketControl
        {
           bool isRun = false;
           Socket socket;
           IPEndPoint ipEndPoint;
           Thread threadListen ;
           byte[] buffer = new byte[1024];  
     
           private void Init()
           {
               ipEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), ConfigInformation.UdpPort);
               socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
               socket.Bind(ipEndPoint);   
             
           }
     
           public void Start()
           {
               Init();
               isRun = true;
               threadListen = new Thread(Listen);
               threadListen.Start();         
           }
     
           private void Listen()
           {
              int dataLength ;
     
               while (isRun)
                   {
                       try
                       {
                                                
                               if ( ( dataLength = socket.Receive(buffer) ) > 0)
                               {
                                   Analyer(Encoding.ASCII.GetString(buffer, 0, dataLength));
                               }
                          
                       }
                       catch(Exception ex)
                       {
                           Helper.LogWrite(ex.Message);
                       }    
                   } 
           }
     
           private void Analyer(string data)
           {
               if (data == "LoadPlan")
               {
                   PlanControl.LoadPlan(ConfigInformation.PlanConfigPath);
               }
           }
     
           public void Stop()
           {   
               isRun = false;
               socket.Shutdown(SocketShutdown.Both);
               socket.Close();
           }
        }
    }

    当执行Stop时出现提示:一个封锁操作被对 WSACancelBlockingCall 的调用中断。

    后经网上查找,原因大概是因为你关闭socket时,socket.Receive(buffer); 仍出于读取状态。

    改为下面就可以了:

    if (socket.Poll(-1,SelectMode.SelectRead))
                           {                      
                               if ( ( dataLength = socket.Receive(buffer) ) > 0)
                               {
                                   Analyer(Encoding.ASCII.GetString(buffer, 0, dataLength));
                               }
                           }
     

     

  • 相关阅读:
    【Java】Java 序列化的高级认识
    【随笔】感同身受
    【教训】徐小平:不要用兄弟情谊来追求共同利益,要用共同利益追求兄弟情谊
    【面试】惠普IT电面
    【面试】中兴
    【面试】国金证券
    【298】◀▶ IDL 系统过程&函数
    【297】IDL 过程、函数&关键字参数
    【296】Python 默认 IDE 修改
    【295】暗黑表格模板及相关
  • 原文地址:https://www.cnblogs.com/siso/p/3692512.html
Copyright © 2011-2022 走看看