C# UDP通信 外网回发数据包给内网问题 1. 你的ipEndPoint就是。2. 服务器端没有必要开启多端口。只要一个端口,处理几千个客户端并发也是没有问题的。服务器端尽量使用异步处理,既受到一个消息时不用等处理,就可以开始并行接收下一个消息了。3. 理论上来说,假设你的客户端也绑定发送端口,并且服务器立刻向ipEndPoint所在的位置返回消息,那么客户端就可以接收到。不过如果你使用tcp(而不是udp),则客户端编程就更加简单,而且可以保证接收到。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不要图省事而使用udp。udp通讯是不靠谱的、经常丢失通讯内容,这就像是一些人鼓吹说越是低级的编程方法越能代表你的技术,其实假设你还不靠谱的时候怎么能追求这种不靠谱的低级方法呢?当然要用经过千锤百炼方法。使用tcp可以保证通讯内容正确不丢失,所以至少在你还在学习的时候,应该使用tcp而不是udp。 感谢您的耐心解答~当服务器收到数据是,做的操作如下:if (udpIn.Available > 0) { IPEndPoint ipEndPoint = null; byte[] buffer = udpIn.Receive(ref ipEndPoint); string text = Encoding.UTF8.GetString(buffer); SetTextIn(text);//显示数据SendMessageAgain("消息收到了");//向内网客户端发送消息确认}这边首先把ipEndPoint置空了,所以没想清楚,原来内网发过来的数据包,经过路由器之后的IP和端口要如何获取?麻烦您稍稍解释一下~嗯呐,关于端口,那就只开一个了,异步处理确实是有必要去实行的~我在网上看到,说这种情况,内网信息发送的端口和接收的端口要是同一个,不懂是否正确?那么服务器端发送的端口和接收的端口是否也需要是同一个端口呢?嗯呐 UDP和TCP的区别,这个我是清楚的,TCP的三次握手可以有效防止丢包~因为这次做的东西是根据需求要使用UDP协议的,所以才比较麻烦,再次感谢~ QQ通讯传输就是UDP 呵呵。 与tcp短连接不同的是,你需要有更多的协议上的设计。假设一个客户端(单线程或者多线程)先后以udp方式发送了10条消息到服务器,服务器收到它的先后次序并不保证与原来的一致,同时服务器处理之后返回消息的次序也是随机的。因此在设计信令协议时,你应该为每一个消息设计相关的序号,当客户端收到一个消息时假设是服务器的回应那么它就应该找到在发送消息是所挂起的(也就是在内存中保存的)委托来回调它。udp比较麻烦的是你可能需要处理确认、重发等机制。而tcp则不需要,因为它可以保证这些。对于tcp长连接与上面也很类似。(考虑基本的性能要求)同一个客户端可能异步发送多个消息,然后服务器可能异步处理,所以服务器发回来的消息一定是跟客户端的次序经常是不同的。设计tcp长连接的客户端,当然也要是异步回调的。tcp短连接则非常简单,因为每一次访问服务器都是“一问一答”,然后就关闭连接;服务器端则不维系长连接,而是每一次客户端请求当作为一个独立的Accept连接处理。 晕!“置空”之后下一条语句不是就用ref方式取回来值了嘛! 哦 对……囧了 然后就可以从这个ipEndPoint中读取内网数据包的外网IP和端口 然后再根据这个IP和端口回发到路由器 路由器就会回发到客户端了……使用同一个连接的话 大致明白了 我要再写着试试看~非常感谢您那么细致的回答 大赞~ 假设服务器端监听8081端口,然后以随机的方式(不特意制定的方式)发送返回消息,可能使用了54321端口,也没有关系。服务器端是“接收和发送的端口”,而不是“发送和接收的端口”。但是假设按照你说的“内网信息发送”,以NAT方式访问外网,那么当然需要外网把返回消息发送到路由器所使用的外网地址和外网端口上,向别的端口发送返回消息那么路由器也不给转发到内网啊。 这个问题就是P2P通讯问题,楼主需要了解NAT的穿透技术。解决的两个方法:1.学习NAT的穿透技术,打洞穿墙。这个我就不说了,网上一大堆资料。2.在路由器上设置下,把你客户端的监听端口给映射出去。(这个方法能快速解决问题,但实用性不强) 不过按楼主所说,服务器是在公网上,也用不着打洞,具体做法是,服务端收到客户端的消息后,同时获取到客户端的IP和端口号(即IPEndPoint),往这个IPEndPoint回发数据包即可。因为这时客户端的路由器应该还保留着这个端口映射信息。 也不一定非要穿透,tcp 长连接,来回自如 楼主 ,问题解决了没有,我是给 DTU 回发数据的时候 DTU 老是收不到 如果你的数据是音频、视频类的文件,使用udp是可行的,但是udp不保证通讯可靠性,可能有丢包,顺序乱等问题。如果是文本、压缩文件、xml等,还是老师使用tcp吧。 菜鸟急求!@# 如何去掉ListView控件的水平滚动条 问了几个群的朋友都没有搞定的小问题.....高手帮忙... GDI+画图 并在Form窗口拖动的问题 高分求教。关于继承的问题。 关于C#将16进制转换成ASCii问题 DataSet中的表能不能填写word中的表? wse 2.0 BT下载:Visual Studio 2005 Enterprise Architect 关于超两字节unicode编码问题 满足一定要求的排序 C#获取本机外网IP
if (udpIn.Available > 0)
{
IPEndPoint ipEndPoint = null;
byte[] buffer = udpIn.Receive(ref ipEndPoint);
string text = Encoding.UTF8.GetString(buffer);
SetTextIn(text);//显示数据
SendMessageAgain("消息收到了");//向内网客户端发送消息确认
}
这边首先把ipEndPoint置空了,所以没想清楚,原来内网发过来的数据包,经过路由器之后的IP和端口要如何获取?麻烦您稍稍解释一下~
嗯呐,关于端口,那就只开一个了,异步处理确实是有必要去实行的~我在网上看到,说这种情况,内网信息发送的端口和接收的端口要是同一个,不懂是否正确?那么服务器端发送的端口和接收的端口是否也需要是同一个端口呢?
嗯呐 UDP和TCP的区别,这个我是清楚的,TCP的三次握手可以有效防止丢包~因为这次做的东西是根据需求要使用UDP协议的,所以才比较麻烦,再次感谢~
晕!“置空”之后下一条语句不是就用ref方式取回来值了嘛!
非常感谢您那么细致的回答 大赞~
假设服务器端监听8081端口,然后以随机的方式(不特意制定的方式)发送返回消息,可能使用了54321端口,也没有关系。服务器端是“接收和发送的端口”,而不是“发送和接收的端口”。但是假设按照你说的“内网信息发送”,以NAT方式访问外网,那么当然需要外网把返回消息发送到路由器所使用的外网地址和外网端口上,向别的端口发送返回消息那么路由器也不给转发到内网啊。
解决的两个方法:
1.学习NAT的穿透技术,打洞穿墙。这个我就不说了,网上一大堆资料。
2.在路由器上设置下,把你客户端的监听端口给映射出去。(这个方法能快速解决问题,但实用性不强)
如果是文本、压缩文件、xml等,还是老师使用tcp吧。