日期:2014-05-18  浏览次数:20827 次

C# UDP协议通信问题
请教下大家,小弟自己写了个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);
   
  }

上面这个就是发送数据的 


------解决方案--------------------
互联网丢包很频繁的,一半一半算好的了
建议还是使用tcp
------解决方案--------------------
探讨
//根据AddressFamily判断是否为ipv4,如果是InterNetWork则为ipv6
if (ip.AddressFamily == AddressFamily.InterNetwork)
IpCollection.Add(ip.ToString());
}
IpArray = new string[IpCollection.Count];
IpCollection.CopyTo(IpArray, 0);
但是在一个机子只有一块网卡的情况下,IpArray[0]指的就是本机地址了吧?