C# UDP协议通信问题

roy1989 2012-03-12 11:31:18
请教下大家,小弟自己写了个CS架构的UDP通信例子~在内网段192.168.0.200,192.168.66.150,192.168.1.26不同网段间测试均没有问题~但是把服务器放置到外网地址之后,内网192.168.1.26发出去的数据包,外网180.169.48.130地址收不到数据包了……请问这个是怎么回事呢?是程序的问题还是网络架构的问题?
192.168.1.26是单位的内网IP,180.169.48.130是单位出口的外网IP~直接为一台机子指定了这个IP连到外网上做服务器,内网的数据从另外的外网口出去……求指导,下附相关代码……谢谢~

IPEndPoint addressIn = new IPEndPoint(IPAddress.Parse(IpArray[0]), int.Parse("1234"));//server
//窗体初始化的时候开始监听UDP端口
udpIn = new UdpClient(addressIn);
// 启动接收线程
Thread thread = new Thread(new ThreadStart(RecieveDataIn));
thread.Start();
MessageBox.Show("中转服务器对内监听已经开启!");

上面这些是服务器开启监听的

当收到数据的时候 :

void RecieveDataIn()
{
while (true)
{
// 如果没有使用多线程这里一定要判断是否收到数据,
// 否则在Receive的时候线程会被挂起(直到接收到UDP请求,程序才会继续执行),造成卡死的现象
// 但是我们这是又开了一个线程,所以不需要判断,所以CPU占用率不会至少50%。
// 这里的udp.Available是对应的udp端口所获取的数据的总大小,与TCP方式不同(TCP是当前请求发送数据的大小)
if (udpIn.Available > 0)
{
IPEndPoint ipEndPoint = null;
byte[] buffer = udpIn.Receive(ref ipEndPoint);

string text = Encoding.UTF8.GetString(buffer);
SetTextIn(text);//显示数据
}}}

上面是显示数据的

private void SendMessage(string text)
{

IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Parse(IpAdd.Text), int.Parse("1234"));//server ipadd.text 目的IP 1234端口
UdpClient udptmp = new UdpClient();
byte[] buffer = Encoding.UTF8.GetBytes(text);
//这里必须要将IP地址传过去,否则会报错(实例化的时候要IP地址反而会有麻烦)
udptmp.Send(buffer, buffer.Length, remoteEndPoint);

}

上面这个就是发送数据的
...全文
256 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
chentao01194691 2012-10-10
  • 打赏
  • 举报
回复
能不能写个具体的案例啊
  • 打赏
  • 举报
回复
[Quote=引用楼主 roy1989 的回复:]
IPAddress.Parse(IpArray[0]
[/Quote]

不要想当然地写什么[0]。

对于服务器,要使用 IPAddress.Any。
  • 打赏
  • 举报
回复
[Quote=引用楼主 roy1989 的回复:]
180.169.48.130是单位出口的外网IP~直接为一台机子指定了这个IP连到外网上做服务器
[/Quote]
你是怎么“指定”的?
roy1989 2012-03-13
  • 打赏
  • 举报
回复
问题解决了 是单位网络架构的问题 数据包能够出去 服务器也能够收到 谢谢楼上的各位~
roy1989 2012-03-13
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sp1234 的回复:]

引用 5 楼 roy1989 的回复:
//根据AddressFamily判断是否为ipv4,如果是InterNetWork则为ipv6
if (ip.AddressFamily == AddressFamily.InterNetwork)
IpCollection.Add(ip.ToString());
}
IpArray = new string[IpCollection.Coun……
[/Quote]嗯呐 这个明白了~客户端写的就是公网IP,往公网IP发送消息~公网IP的服务端也监听了对应的端口~
我大致猜到了问题所在 可能是监听出错了 发出去的消息包应该没啥问题~
IPEndPoint addressIn = new IPEndPoint(IPAddress.Any,int.Parse("1234"));//server
是不是开监听的时候,改成上面这样的Any就可以了?那么 端口号能设置为监听所有端口呢?会不会造成内存大量占用?
您之前的回答对我帮助很大 非常感谢~
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 roy1989 的回复:]
//根据AddressFamily判断是否为ipv4,如果是InterNetWork则为ipv6
if (ip.AddressFamily == AddressFamily.InterNetwork)
IpCollection.Add(ip.ToString());
}
IpArray = new string[IpCollection.Count];
IpCollection.CopyTo(IpArray, 0);
但是在一个机子只有一块网卡的情况下,IpArray[0]指的就是本机地址了吧?
[/Quote]

跟那么什么“本机地址”没有关系。

不用搞什么判断upv4/6,就算你写“127.0.0.1”你单击测试一下也可以连接。

关键是你绑定“死”了什么IP,客户端就得写什么IP。而就算你只能得到一个ipv4的ip地址,你用这个ip去监听服务也是远远不够的(例如就不能监听到127.0.0.1的,以及所谓的端口映射的)。

使用 IPAddress.Any 对于tcp服务有专门的功能含义,不要抠什么 Dns.GetHostAddresses 是不是代表你用本机 IP 的概念。IPAddress.Any 用来打开本机所有地址接口, Dns.GetHostAddresses根本代替不了。
roy1989 2012-03-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sp1234 的回复:]

引用 5 楼 roy1989 的回复:
指定的话 就是给一台电脑设置了固定IP地址 IP地址是公网IP~就是直接从出口出去的~类似于电信ADSL直接拨号或者光纤直连的状态~


晕!一台内网的电脑设置了所谓的“公网IP”,这台电脑还能联网么?
[/Quote]
是一台笔记本 直接用网线连上最外层的口子~固定公网IP~和光纤直连是一个道理的吧?这个步骤是单位网管操作的=。=囧……可以正常上网~
内网的机子ping那个公网IP的机子,可以ping通……
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 roy1989 的回复:]
指定的话 就是给一台电脑设置了固定IP地址 IP地址是公网IP~就是直接从出口出去的~类似于电信ADSL直接拨号或者光纤直连的状态~
[/Quote]

晕!一台内网的电脑设置了所谓的“公网IP”,这台电脑还能联网么?
roy1989 2012-03-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sp1234 的回复:]

引用楼主 roy1989 的回复:
IPAddress.Parse(IpArray[0]


不要想当然地写什么[0]。

对于服务器,要使用 IPAddress.Any。
[/Quote]
指定的话 就是给一台电脑设置了固定IP地址 IP地址是公网IP~就是直接从出口出去的~类似于电信ADSL直接拨号或者光纤直连的状态~
这个问题确实要考虑一下看看,IpArray[0]代指本机IP……获取代码如下:
System.Net.IPAddress[] addressList = Dns.GetHostAddresses(Dns.GetHostName());
StringCollection IpCollection = new StringCollection();
foreach (IPAddress ip in addressList)
{
//根据AddressFamily判断是否为ipv4,如果是InterNetWork则为ipv6
if (ip.AddressFamily == AddressFamily.InterNetwork)
IpCollection.Add(ip.ToString());
}
IpArray = new string[IpCollection.Count];
IpCollection.CopyTo(IpArray, 0);
但是在一个机子只有一块网卡的情况下,IpArray[0]指的就是本机地址了吧?
roy1989 2012-03-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 nonocast 的回复:]

互联网丢包很频繁的,一半一半算好的了
建议还是使用tcp
[/Quote]
嗯呐 UDP还是会有这个问题~TCP三次握手就好很多了 现在就是没明白 到底是丢包了 还是程序的问题 或者网络架构的问题~
nonocast 2012-03-12
  • 打赏
  • 举报
回复
互联网丢包很频繁的,一半一半算好的了
建议还是使用tcp

110,536

社区成员

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

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

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