看代码:
Socket clientSocket=new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
clientSocket.SetSocketOption( SocketOptionLevel.Udp, SocketOptionName.ReceiveTimeout, 3000) clientSocket.ReceiveFrom( data1,ref ipep ) ;为何我设定的ReceiveTimeout,总是不启作用,如果对方不存在它会一直阻塞下去;我拿它是没什么办法了,还望高手驻足赐教!

解决方案 »

  1.   

    thread异步
    楼主不厚道,说给200只给了100
      

  2.   

    是这样的,我的客户端每隔几分钟就要向服务器请求数据;如果服务器突然死机或掉电的话,那么客户端就会请求不到数据,从而一直阻塞,导致客户端假死;所以就希望可以设定 receive 方法的超时时间,让它产生异常,以便我处理。
      

  3.   

    有二个方案可以做:
    1、异步,上面几位已经说得很清楚了,我也就不多说了。
    2、用poll函数检查读状态:
        if (this.socket.Poll(0, System.Net.Sockets.SelectMode.SelectRead))
        {
                  //收到数据
         }
    如果poll函数出错,会抛出异常,一般是目标端口已经关闭。poll函数不会阻塞,你可以在外面加一个while和一个循环标识。如果认为需要退出,直接把循环标识设置为flash即可。
      

  4.   

    老大你都没有连接到服务器,怎么可以接受数据呀????????clientSocket.Connect(ipep);
    clientSocket.ReceiveFrom( data1,ref ipep );
      

  5.   

    写一个类,继承socket,当有新连接的时候,启动一个实例就行了,方便
      

  6.   

    //开启本机7131端口,用来发送和接收数据
                IPEndPoint localport = new IPEndPoint(IPAddress.Any, 7131);
                Socket localsocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                localsocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, int.Parse(textBox5.Text.Trim()));
                localsocket.Bind(localport);这是我的,给你参考一下,我的和你的不一样的地方:
    SocketOptionLevel.Socket
    你的是SocketOptionLevel.Udp
      

  7.   

    再多写一个线程了,收到了invoke到主线程上去,又不会堵塞,又没有同步异步问题,我一直都用他.
      

  8.   

    UdpClient m_udp = new UdpClient(port);
    m_udp.Client.ReceiveBufferSize = Util.MAXPACKETSIZE * 10;
    m_receiveThread = new Thread(new ThreadStart(ReceivePacket));
    m_receiveThread.IsBackground = true;
    m_receiveThread.Start();void ReceivePacket()
    {
        while (m_udp!=null && m_receiveThread.IsAlive)
        {
            IPEndPoint pt = new IPEndPoint(0L, 0);
            byte[] data = m_udp.Receive(ref pt);        if (OnDataReceived != null)
                OnDataReceived(pt, data);
        }
    }
    这样就可以了.如果要更新界面,注意用InvokeRequired 和 Invoke 方法