UDP通讯,外网向内网发消息,内网无法收到 疯了啊先发了个帖子也是这个问题。。后来又看了些文章,说内网一台电脑上先向外网发送一个UDP包。。外网收到了这个包。。并从中得到内网中该电脑的公网IpEndPoint,通过这个IpEndPoint就可以与之通讯。现在我得到了IpEndPoint,为什么内网里的电脑还是收不到消息呢。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 貌似是要建立好连接后,直接用那个socket才可以通讯。 请问能详细说明下吗。。我用的是UDPClient。。你是指UDPClient.client这个? 内网路由设置?做端口映射?那QQ是怎么做的。。用HTTP隧道? 内网在把消息传给服务器时。。是在NAT做了映射。。得到了公网的IP和端口。。而我服务器得到的也是这个IP和端口。但是我通过这个IP和端口却不能把消息发送给内网的客户端..不知道是哪里出了错 外网是不能够主动发送UDP数据包给内网机器的.因为NAT里没有映射,包来到路由器就进不去了.要想内网能够接收到数据,必须的是内网先发一个包给外网.外网收到此包,获得IP与端口,(注意:获得的端口是NAT自动分配的,并不是内网自定义启动的监听端口).有关闭时间限制.记得好像是一般是45秒以内.要确保内网能接收到外网的数据.最好是在收到内网发的包30秒内发送此包. 首先,服务器在接收对方消息时同时获得对方的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连接超时问题,我确实没想到会这么短,- -|,因为有人说是几分钟到几小时,但如果是这个因素引起的话。。那么问题就好解决了 过ipe获得对方的IPENDPOINT没问题啊,服务器发送消息时就使用这个ipe的IP与端口发送,就能够把消息发到. 要想长期保持NAT分配的端口一直存在,我以前的做法是每隔30秒左右给对方发一个在线通知包.这样,NAT分配的端口就能一直保持下来. 谢谢。。那么这样的话。。就是NAT的问题了。。我在去试试看 就是外网只能看到NAT的IP,所以发不过去的啦 发一下 如何 UDP 循环发包代码 谢谢 请问每隔一分钟手动执行一次GC,合适吗?? 求问一个字符串截取的问题 请教socket问题!! 急 帮忙看下什么意思 字典的遍历问题 C#的前景怎么样? 请问关于动态数组的问题 C#list集合问题 高分求教!!! c#中关于listview控件 如何实现内部内容的拖动排序,可以多选拖动 XmlTextReader问题? 如何使用C#代码实现数据库触发器的功能 搞定了WINFORM下DataGridView底部固定合计行被最后一行遮挡的问题了,发布到这里以备那些有需要的朋友们参考
请问能详细说明下吗。。我用的是UDPClient。。你是指UDPClient.client这个?
但是我通过这个IP和端口却不能把消息发送给内网的客户端..不知道是哪里出了错
{
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连接超时问题,我确实没想到会这么短,- -|,因为有人说是几分钟到几小时,但如果是这个因素引起的话。。那么问题就好解决了