看代码:
Socket clientSocket=new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
clientSocket.SetSocketOption( SocketOptionLevel.Udp, SocketOptionName.ReceiveTimeout, 3000) clientSocket.ReceiveFrom( data1,ref ipep ) ;为何我设定的ReceiveTimeout,总是不启作用,如果对方不存在它会一直阻塞下去;我拿它是没什么办法了,还望高手驻足赐教!
Socket clientSocket=new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
clientSocket.SetSocketOption( SocketOptionLevel.Udp, SocketOptionName.ReceiveTimeout, 3000) clientSocket.ReceiveFrom( data1,ref ipep ) ;为何我设定的ReceiveTimeout,总是不启作用,如果对方不存在它会一直阻塞下去;我拿它是没什么办法了,还望高手驻足赐教!
楼主不厚道,说给200只给了100
1、异步,上面几位已经说得很清楚了,我也就不多说了。
2、用poll函数检查读状态:
if (this.socket.Poll(0, System.Net.Sockets.SelectMode.SelectRead))
{
//收到数据
}
如果poll函数出错,会抛出异常,一般是目标端口已经关闭。poll函数不会阻塞,你可以在外面加一个while和一个循环标识。如果认为需要退出,直接把循环标识设置为flash即可。
clientSocket.ReceiveFrom( data1,ref ipep );
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
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 方法