200 分跪求 UDP 通讯问题

nehu 2005-09-07 11:23:26
看代码:
Socket clientSocket=new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
clientSocket.SetSocketOption( SocketOptionLevel.Udp, SocketOptionName.ReceiveTimeout, 3000)

clientSocket.ReceiveFrom( data1,ref ipep ) ;

为何我设定的ReceiveTimeout,总是不启作用,如果对方不存在它会一直阻塞下去;我拿它是没什么办法了,还望高手驻足赐教!
...全文
455 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
skyover 2006-02-19
  • 打赏
  • 举报
回复
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 方法
yangzhenhai 2006-01-23
  • 打赏
  • 举报
回复
再多写一个线程了,收到了invoke到主线程上去,又不会堵塞,又没有同步异步问题,我一直都用他.
lzcub 2006-01-23
  • 打赏
  • 举报
回复
//开启本机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
网_风 2006-01-22
  • 打赏
  • 举报
回复
老大你都没有连接到服务器,怎么可以接受数据呀????????

clientSocket.Connect(ipep);
clientSocket.ReceiveFrom( data1,ref ipep );
tophy 2006-01-22
  • 打赏
  • 举报
回复
有二个方案可以做:
1、异步,上面几位已经说得很清楚了,我也就不多说了。
2、用poll函数检查读状态:
if (this.socket.Poll(0, System.Net.Sockets.SelectMode.SelectRead))
{
//收到数据
}
如果poll函数出错,会抛出异常,一般是目标端口已经关闭。poll函数不会阻塞,你可以在外面加一个while和一个循环标识。如果认为需要退出,直接把循环标识设置为flash即可。
IcyPlayer 2006-01-22
  • 打赏
  • 举报
回复
写一个类,继承socket,当有新连接的时候,启动一个实例就行了,方便
心情解码 2006-01-22
  • 打赏
  • 举报
回复
:)

-
handsome0916 2006-01-22
  • 打赏
  • 举报
回复
开一个线程接收,设为子线程,当主线程结束的时候子线程就会自动关闭,不会阻塞下去
zhgroup 2005-09-09
  • 打赏
  • 举报
回复
用异步的方式
knoros2004 2005-09-08
  • 打赏
  • 举报
回复
不会啊,我用了很正常
nehu 2005-09-08
  • 打赏
  • 举报
回复
顶上去
nehu 2005-09-08
  • 打赏
  • 举报
回复
别沉了,兄弟!
TechEye 2005-09-07
  • 打赏
  • 举报
回复
有异步模式或者新开辟一个线程用于阻塞接收(其实也是异步)
nehu 2005-09-07
  • 打赏
  • 举报
回复
是这样的,我的客户端每隔几分钟就要向服务器请求数据;如果服务器突然死机或掉电的话,那么客户端就会请求不到数据,从而一直阻塞,导致客户端假死;所以就希望可以设定 receive 方法的超时时间,让它产生异常,以便我处理。
syeerzy 2005-09-07
  • 打赏
  • 举报
回复
事实上,即使你可以控制这个程序还是存在很大问题,当你等待接收的时侯其他的客户机都连不上。

所以,换成多线程的方法可以把这2个问题一起解决。
nehu 2005-09-07
  • 打赏
  • 举报
回复
呵呵,不是我不厚道,因为最多只能给一百分!
解决问题的话,分不够可以再加!
nik_Amis 2005-09-07
  • 打赏
  • 举报
回复
up
yinshuhai 2005-09-07
  • 打赏
  • 举报
回复
你试试用程序来控制时间,如接收到连接返回一个数据包,连多少次后没有数据包得到就认为失效了
wsh236 2005-09-07
  • 打赏
  • 举报
回复
还是鼎鼎说得有点道理
lixin615243 2005-09-07
  • 打赏
  • 举报
回复
那样不行哦,做人要厚道
加载更多回复(3)

110,500

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧