跪求大神解决,UDP内网和外网通信问题

成成_Baby 2015-04-19 09:37:16
我在博客上看到外网到内网UDP通信的解决方法:内网主动和外网连接,外网获取其代理服务器的IP地址和临时分配的通讯端口,向其发送UDP消息即可。(http://blog.csdn.net/foas/article/details/338983)
于是我编写了以下代码:

//Server端的UDPLIstener
public string[] Listener()
{
string returnData = string.Empty;
string[] msgArray;
try
{
IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 5000);
UdpClient udpClient = new UdpClient(RemoteIpEndPoint);
Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);
returnData += Encoding.ASCII.GetString(receiveBytes);
returnData += ";;" + RemoteIpEndPoint.Address.ToString() + ";;" + RemoteIpEndPoint.Port.ToString();
msgArray = Regex.Split(returnData, ";;");
//msg;;ip;;port
udpClient.Close();
}
catch (Exception ex)
{
//do something here
throw;
}
return msgArray;
}


//接收到客户端的消息后,向客户端发送消息,其中ip和port为上一个方法保存的ip和port
public static void Sender(IPAddress ip, int port, string msg)
{
try
{
IPEndPoint ipep = new IPEndPoint(ip, 5000);
UdpClient udpClient = new UdpClient();
Byte[] sendBytes = Encoding.ASCII.GetBytes(msg);
//udpClient.JoinMulticastGroup(ip);
udpClient.Send(sendBytes, sendBytes.Length, ipep);//发送
udpClient.Close();//断开连接
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}


//问题是在客户端的UDPListener要侦听哪个端口,这样写客户端仍然收不到消息
public string Listener()
{
string returnData = string.Empty;
try
{
IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 5000);
UdpClient udpClient = new UdpClient(RemoteIpEndPoint);
//UdpClient udpClient = new UdpClient(5000, AddressFamily.InterNetwork);
Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);
returnData += Encoding.ASCII.GetString(receiveBytes);
udpClient.Close();
}
catch (Exception ex)
{
//do something here
MessageBox.Show(ex.ToString());
throw;
}
return returnData;//如果未接收到消息,返回值为空
}


跪求大神解决
...全文
1165 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
成成_Baby 2015-04-21
  • 打赏
  • 举报
回复
引用 7 楼 Runnerchin 的回复:
[quote=引用 5 楼 wdcdavyc 的回复:] [quote=引用 4 楼 Runnerchin 的回复:] tcp建立的连接只能用于tcp通信。和udp完全不相干
我做的软件需要服务器向客户端通过UDP通信,我在网上搜到的UDP打洞需要在内网的主机A/B分别向在外网的服务器S发送UDP消息,服务器记录下A/B的IP地址和port,然后服务器S分别向A/B发送B/A的ip和port,然后A和B就可以通信,但是这儿还是涉及到外网向内网的UDP通信,不知道该怎么解决外网向内网的UDP通信问题,求教[/quote] 抱歉,UDP打洞我不会。如果这方面没有头绪的话,建议重新考虑一下通信模式[/quote] 好吧,谢了
X-i-n 2015-04-20
  • 打赏
  • 举报
回复
引用 5 楼 wdcdavyc 的回复:
[quote=引用 4 楼 Runnerchin 的回复:] tcp建立的连接只能用于tcp通信。和udp完全不相干
我做的软件需要服务器向客户端通过UDP通信,我在网上搜到的UDP打洞需要在内网的主机A/B分别向在外网的服务器S发送UDP消息,服务器记录下A/B的IP地址和port,然后服务器S分别向A/B发送B/A的ip和port,然后A和B就可以通信,但是这儿还是涉及到外网向内网的UDP通信,不知道该怎么解决外网向内网的UDP通信问题,求教[/quote] 抱歉,UDP打洞我不会。如果这方面没有头绪的话,建议重新考虑一下通信模式
把分全给哥 2015-04-20
  • 打赏
  • 举报
回复
一楼说的就是我要说的,谢谢
成成_Baby 2015-04-19
  • 打赏
  • 举报
回复
引用 4 楼 Runnerchin 的回复:
tcp建立的连接只能用于tcp通信。和udp完全不相干
我做的软件需要服务器向客户端通过UDP通信,我在网上搜到的UDP打洞需要在内网的主机A/B分别向在外网的服务器S发送UDP消息,服务器记录下A/B的IP地址和port,然后服务器S分别向A/B发送B/A的ip和port,然后A和B就可以通信,但是这儿还是涉及到外网向内网的UDP通信,不知道该怎么解决外网向内网的UDP通信问题,求教
X-i-n 2015-04-19
  • 打赏
  • 举报
回复
tcp建立的连接只能用于tcp通信。和udp完全不相干
成成_Baby 2015-04-19
  • 打赏
  • 举报
回复
引用 1 楼 Runnerchin 的回复:
你的方法无效,UDP是无连接协议,发送方的端口是由发送方随机生成的(根据不同的网络环境,发送方的IP也有可能是在地址池中随机选取的),发送完以后,该IP+端口就已经无效了。 有两种方法,在内网边界上,做端口映射,指定固定的IP+UDP端口给内网的客户端,好处是可以自由双向通信,不需要先由内网端发起通信,这种方案需要你有网络的管理权限 或者,使用TCP协议,由内网发起到外网端的连接,外网端接收以后会建立一条连接,在主动关闭前会一直存在,这样外网端可以根据对端的IP+端口给内网发信息。
为什么还是不行?我在客户端程序中首先与服务端建立了一个TCP连接,服务端记录客户端的IP和端口号,当服务端收到客户端的UDP消息时,向记录的IP地址和端口号发送UDP消息,客户端还是收不到消息
足球中国 2015-04-19
  • 打赏
  • 举报
回复
UDP打洞,打洞的前提是你有一个公网的IP做为中转。
X-i-n 2015-04-19
  • 打赏
  • 举报
回复
你的方法无效,UDP是无连接协议,发送方的端口是由发送方随机生成的(根据不同的网络环境,发送方的IP也有可能是在地址池中随机选取的),发送完以后,该IP+端口就已经无效了。 有两种方法,在内网边界上,做端口映射,指定固定的IP+UDP端口给内网的客户端,好处是可以自由双向通信,不需要先由内网端发起通信,这种方案需要你有网络的管理权限 或者,使用TCP协议,由内网发起到外网端的连接,外网端接收以后会建立一条连接,在主动关闭前会一直存在,这样外网端可以根据对端的IP+端口给内网发信息。

110,533

社区成员

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

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

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