UDP通讯,外网向内网发消息,内网无法收到

pylmcy150 2009-02-28 06:05:00
疯了啊。。。先发了个帖子也是这个问题。。后来又看了些文章,说内网一台电脑上先向外网发送一个UDP包。。外网收到了这个包。。并从中得到内网中该电脑的公网IpEndPoint,通过这个IpEndPoint就可以与之通讯。
现在我得到了IpEndPoint,为什么内网里的电脑还是收不到消息呢。
...全文
1848 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
ma793646122 2012-10-08
  • 打赏
  • 举报
回复
发一下 如何 UDP 循环发包代码 谢谢
zxytcjj 2011-03-07
  • 打赏
  • 举报
回复
就是外网只能看到NAT的IP,所以发不过去的啦
dage_01 2010-09-25
  • 打赏
  • 举报
回复
学 习
pylmcy150 2009-03-03
  • 打赏
  • 举报
回复
帖子先结了。。发贴好长时间总算得到了满意的结果,谢谢各位了
pylmcy150 2009-03-03
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 beargo 的回复:]
过ipe获得对方的IPENDPOINT没问题啊,服务器发送消息时就使用这个ipe的IP与端口发送,就能够把消息发到.
[/Quote]
谢谢。。那么这样的话。。就是NAT的问题了。。我在去试试看
beargo 2009-03-03
  • 打赏
  • 举报
回复
要想长期保持NAT分配的端口一直存在,我以前的做法是每隔30秒左右给对方发一个在线通知包.这样,NAT分配的端口就能一直保持下来.
beargo 2009-03-03
  • 打赏
  • 举报
回复
过ipe获得对方的IPENDPOINT没问题啊,服务器发送消息时就使用这个ipe的IP与端口发送,就能够把消息发到.
zhengxia19 2009-03-02
  • 打赏
  • 举报
回复
以前试过这种东西
由于网内的机器没有外网IP
所以外网连接不进来的
这样必须在内网的服务器做端口映射吧
pylmcy150 2009-03-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 aimeast 的回复:]
貌似是要建立好连接后,直接用那个socket才可以通讯。
[/Quote]

请问能详细说明下吗。。我用的是UDPClient。。你是指UDPClient.client这个?
pylmcy150 2009-03-02
  • 打赏
  • 举报
回复
我要对方关掉了防护墙,所以不会存在消息被防火墙拦截了。
打洞方面的知识我看过。。一般是内网于内网之间才需要打洞,如果是外网的服务器不能与内网进行通讯,那么。。不管怎么打,都不可能连接成功。
所以我的问题就是出现在外网与内网的通讯。。。
话说我是新手,做毕业设计才刚学下网络通讯,有高手的话,请指点下~~
pylmcy150 2009-03-02
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 beargo 的回复:]
外网是不能够主动发送UDP数据包给内网机器的.因为NAT里没有映射,包来到路由器就进不去了.要想内网能够接收到数据,必须的是内网先发一个包给外网.外网收到此包,获得IP与端口,(注意:获得的端口是NAT自动分配的,并不是内网自定义启动的监听端口).有关闭时间限制.记得好像是一般是45秒以内.要确保内网能接收到外网的数据.最好是在收到内网发的包30秒内发送此包.
[/Quote]
首先,服务器在接收对方消息时同时获得对方的IPENDPOINT,代码如下

public void StartReceive(MsgReceiverEventArgs myMsgReceiverEventArgs)
{
uReceiverSlot.BeginReceive(new AsyncCallback(ReceiveCallback),myMsgReceiverEventArgs);
Thread.Sleep(System.Threading.Timeout.Infinite);
}

/// <summary>
/// UDPClient异步接收到指令后的函数
/// </summary>
/// <param name="iar"></param>
private void ReceiveCallback(IAsyncResult iar)
{
IPEndPoint ipe = ipEp;
Byte[] receiveBytes = uReceiverSlot.EndReceive(iar, ref ipe);
string receiveMessage = Encoding.BigEndianUnicode.GetString(receiveBytes);
if (receiveBytes.Length > 0)
{
MsgReceiverEventArgs myMsgReceiverEventArgs_msg = (MsgReceiverEventArgs)iar.AsyncState;
myMsgReceiverEventArgs_msg.RecvMsg = receiveMessage;
myMsgReceiverEventArgs_msg.Ipendpoint = ipe;
if (OnMsgReceived != null)
{
OnMsgReceived(this, myMsgReceiverEventArgs_msg);
}
}
//重新进行接收
uReceiverSlot.BeginReceive(new AsyncCallback(ReceiveCallback), (MsgReceiverEventArgs)iar.AsyncState);
}

即通过ipe获得对方的IPENDPOINT,不知道这里是否有问题?

然后,NAT连接超时问题,我确实没想到会这么短,- -|,因为有人说是几分钟到几小时,但如果是这个因素引起的话。。那么问题就好解决了
天乐 2009-03-02
  • 打赏
  • 举报
回复
楼上讲的很清楚了
beargo 2009-03-02
  • 打赏
  • 举报
回复
外网是不能够主动发送UDP数据包给内网机器的.因为NAT里没有映射,包来到路由器就进不去了.要想内网能够接收到数据,必须的是内网先发一个包给外网.外网收到此包,获得IP与端口,(注意:获得的端口是NAT自动分配的,并不是内网自定义启动的监听端口).有关闭时间限制.记得好像是一般是45秒以内.要确保内网能接收到外网的数据.最好是在收到内网发的包30秒内发送此包.
pylmcy150 2009-03-02
  • 打赏
  • 举报
回复
内网在把消息传给服务器时。。是在NAT做了映射。。得到了公网的IP和端口。。而我服务器得到的也是这个IP和端口。
但是我通过这个IP和端口却不能把消息发送给内网的客户端..不知道是哪里出了错
pylmcy150 2009-03-02
  • 打赏
  • 举报
回复
内网路由设置?做端口映射?那QQ是怎么做的。。用HTTP隧道?
zzultc 2009-03-01
  • 打赏
  • 举报
回复
“外网向内网发消息,内网无法收到”
屏蔽陌生的外网访问内网,防火墙 ,专门用来干这个的!
你的这个需要用到穿透,也叫打洞 才行。网上搜搜就知道原因啦!
aimeast 2009-03-01
  • 打赏
  • 举报
回复
貌似是要建立好连接后,直接用那个socket才可以通讯。
EveryCase 2009-03-01
  • 打赏
  • 举报
回复
顶~~~~~~~~~~~~~~~~~~~

111,088

社区成员

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

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

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