2017-02-15 2 views
1

Ich habe einfache UDP-Socket-Verbindung erstellt, um Daten zwischen dem lokalen Netzwerk zu senden. Die Verbindung besteht aus zwei Arten: Peer-to-Peer- und Gruppen-Broadcast. Im Folgenden finden Sie meine Klasse:UDP-Socket kann Paket nicht an DHCP-Adresse senden

public class CandyCaneUdpServer 
{ 
    Socket sck; 
    EndPoint LocalEP; 
    EndPoint RemoteEP; 
    int port = 80; 
    IAsyncResult oldAsyncResult; 

    public event EventHandler<MessageObject> RaiseMessageReceivedEvent; 

    public CandyCaneUdpServer() 
    { 
     sck = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
     sck.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 
     sck.ExclusiveAddressUse = false; 
     LocalEP = new IPEndPoint(IPAddress.Parse(UdpUtility.GetLocalIP()), port); 
     RemoteEP = new IPEndPoint(IPAddress.Any, port); 
    } 

    public void Serve() 
    { 
     sck.Bind(LocalEP); 
     byte[] _buffer = new byte[1500]; 
     oldAsyncResult = sck.BeginReceiveFrom(_buffer, 0, _buffer.Length, SocketFlags.None, ref RemoteEP, new AsyncCallback(MessageCallBack), _buffer); 
    } 

    private void MessageCallBack(IAsyncResult aResult) 
    { 
     int size = sck.EndReceiveFrom(aResult, ref RemoteEP); 
     if (size > 0) 
     { 
      byte[] receivedData; 
      receivedData = (byte[])aResult.AsyncState; 
      MessageObject obj; 
      IFormatter f = new BinaryFormatter(); 
      using (MemoryStream s = new MemoryStream(receivedData)) 
      { 
       obj = (MessageObject)f.Deserialize(s); 
      } 
      OnRaiseMessageReceivedEvent(obj); 
     } 

     var _buffer = new byte[1500]; 
     oldAsyncResult = sck.BeginReceiveFrom(_buffer, 0, _buffer.Length, SocketFlags.None, ref RemoteEP, new AsyncCallback(MessageCallBack), _buffer); 
    } 

    protected virtual void OnRaiseMessageReceivedEvent(MessageObject e) 
    { 
     EventHandler<MessageObject> handler = RaiseMessageReceivedEvent; 
     if (handler != null) 
     { 
      handler(this, e); 
     } 
    } 
} 

Im Folgenden finden Sie Peer-Client (Sender)-to-Peer: Server-to-Peer Peer

public class CandyCaneUdpClient 
{ 
    Socket sck; 
    EndPoint RemoteEP; 

    public CandyCaneUdpClient(string RemoteIP, int RemotePort) 
    { 
     sck = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
     sck.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 
     sck.ExclusiveAddressUse = false; 
     RemoteEP = new IPEndPoint(IPAddress.Parse(RemoteIP), RemotePort); 
    } 

    public void Send(int MessageId, string Message, __MessageObjectType t = __MessageObjectType.P2P) 
    { 
     byte[] msg; 
     msg = Encoding.UTF8.GetBytes(Message); 
     var obj = new MessageObject() 
     { 
      Id = MessageId, 
      Type = t, 
      SourceIP = UdpUtility.GetLocalIP(), 
      TargetIP = ((IPEndPoint)RemoteEP).Address.ToString(), 
      SentTime = DateTime.Now, 
      Message = Message 
     }; 
     IFormatter f = new BinaryFormatter(); 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      f.Serialize(ms, obj); 
      var msgByte = ms.ToArray(); 
      sck.SendTo(msgByte, msgByte.Length, SocketFlags.None, RemoteEP); 
     } 
    } 
} 

Der Code für alle Ether-net Maschinen fein arbeitet. Wenn ein WLAN-Client verbunden ist, kann der Wireless-PC Daten senden, aber keine Daten empfangen. Wenn ich die IP untersuche, hat der EtherNet-Client die IP-Adresse 192.168.211 .---. während Wireless-PC hat eine IP von 192.168.0 .--. Ich frage mich, ob die DHCP-Adresse das Problem verursacht. Der Gruppen-Chat funktioniert gut.

public class CandyCaneUdpGroupChatListener 
    { 
     UdpClient listener; 

     IPAddress routerBindIP; 
     readonly int routerBindPort = UdpUtility.GroupChatDefinedPort(); 
     EndPoint routerEP, senderEP; 

     public event EventHandler<MessageObject> RaiseMessageReceivedEvent; 

     public CandyCaneUdpGroupChatListener() 
     { 
      routerBindIP = IPAddress.Parse(UdpUtility.GroupChatRouterBindAddress()); 
      routerEP = new IPEndPoint(routerBindIP, routerBindPort); 
      senderEP = new IPEndPoint(IPAddress.Parse(UdpUtility.GetLocalIP()), routerBindPort); 


      listener = new UdpClient(); 

      listener.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 

      listener.ExclusiveAddressUse = false; 
      listener.Client.Bind(senderEP); 
      listener.JoinMulticastGroup(routerBindIP); 

      var _buffer = new byte[1500]; 

      listener.Client.BeginReceiveFrom(_buffer, 0, _buffer.Length, SocketFlags.None, ref routerEP, 
       new AsyncCallback(ReceiveMessage), _buffer); 
     } 

     private void ReceiveMessage(IAsyncResult result) 
     { 
      if (listener == null) return; 
      if (listener.Client == null) return; 
      int size = listener.Client.EndReceiveFrom(result, ref routerEP); 

      if (size > 0) 
      { 
       byte[] receivedData; 
       receivedData = (byte[])result.AsyncState; 
       MessageObject obj; 
       IFormatter f = new BinaryFormatter(); 
       using (MemoryStream s = new MemoryStream(receivedData)) 
       { 
        obj = (MessageObject)f.Deserialize(s); 
        //if (obj.SourceIP == UdpUtility.GetLocalIP()) return; 
       } 
       MessageReceived(obj); 
      } 

      var _buffer = new byte[1500]; 
      listener.Client.BeginReceiveFrom(_buffer, 0, _buffer.Length, SocketFlags.None, ref routerEP, 
       new AsyncCallback(ReceiveMessage), _buffer); 
     } 

     protected virtual void MessageReceived(MessageObject e) 
     { 
      EventHandler<MessageObject> handler = this.RaiseMessageReceivedEvent; 
      if (handler != null) 
      { 
       handler(this, e); 
      } 
     } 

     public void Disconnect() 
     { 
      listener.DropMulticastGroup(routerBindIP);   
     } 

    } 

Antwort

1

Überprüfen Sie, wie Sie Ihre verkabelten und drahtlosen Netzwerk-Subnetze ausgelegt haben. Anscheinend haben Sie hier zwei verschiedene DHCP-Server - einen für das kabelgebundene Netzwerk und einen für das drahtlose Netzwerk.

Stellen Sie sicher, dass Ihre Netzwerkrouter so konfiguriert sind, dass ein Host in einem Subnetz mit einem Host im anderen Subnetz kommunizieren kann.

Um festzustellen, ob ein Host in einem Subnetz mit einem Host im anderen Subnetz kommunizieren kann, können Sie das Dienstprogramm für die Netzwerkprotokollverfolgung oder das Ping-Dienstprogramm verwenden.

Unter Windows wird die Trace-Route als tracert.exe-Anwendung implementiert, die Sie im Verzeichnis C:\Windows\System32 finden.

Angenommen, Sie auf dem Ethernet-Attached-Client sind, könnten Sie es mit der folgenden Befehlszeile ausführen, um zu versuchen die Route zum drahtlosen PC zu verfolgen (nähme er die Adresse 192.168.0.104 hat):

C:> \Windows\System32\tracert.exe 192.168.0.104 

Sie sollten Ausgabe sehen, die in etwa so aussieht:

Tracing route to 192.168.0.104 
over a maximum of 30 hops: 

1 1 ms  1 ms <1 ms 192.168.211.54 
... (possibly other entries her) 
2 1 ms  1 ms  1 ms 192.168.0.104 

Trace complete. 

Wenn die Spur nicht abgeschlossen werden kann, ist es ein zeigen, dass Ihr Netzwerkverkehr nicht an die Maschine bekommen Sie zu verfolgen versuchen.

Beachten Sie, dass, wenn tracert fehlschlägt, es keine 100% ige Anzeige von Verbindungsfehlern ist. Es kann ein Hinweis darauf sein, dass ICMP-Datenverkehr von einer Firewall blockiert wird oder der Zielcomputer nicht auf ICMP-Anforderungen reagiert.

+0

Leider habe ich keinen Zugriff auf Geräte. –

+0

Versuchte Verfolgung. Ergebnisse der Ether-net-fähigen Ablaufverfolgungsmaschine ** Zeitgesteuerte Anforderung **, während die Verfolgung von einem drahtlos verbundenen Laptop ein Erfolg ist. Ich verstehe nicht, warum die Verbindung nur in eine Richtung gehen kann. –

+1

Vielleicht ist dies ein Firewall-Konfigurationsproblem. Stellen Sie sicher, dass alle Ports, die für die Kommunikation Ihrer Anwendung erforderlich sind, auf beiden Computern geöffnet sind. – STLDeveloper