Selezionare l' interfaccia di UDPSocket

Avendo a disposizione diverse interfacce di rete, ho la necessit di selezionarne una non di “default”.

Per far ci eseguo il seguente codice:

sub SetMac(MAC as string) If Mac <> "" then For Looping = 0 to System.NetworkInterfaceCount-1 Iface = System.GetNetworkInterface(Looping) if Iface.MACAddress = MAC then TNSPSocket.NetworkInterface = Iface end if next End If .....

Tramite le utility di windows e gli strumenti di debug vedo che il socket in ascolto sull’ interfaccia e la porta selezionata.

Quando tento di inviare un datagramma, questo non viene spedito ma con Wireshark vedo che ad ogni tentativo viene effettuata una richiesta per sapere il Mac address del destinatario (ARP).

Nota: l’ interfaccia che esegue la richiesta quella che ho selezionato.

Se non imposto l’ interfaccia, tutto funziona senza problemi.

Potresti riportare la configurazione IP delle interfacce di rete e l’indirizzo destinatario del datagramma che intendi inviare?

I parametri delle interfacce che uso sono le seguenti
1-
IP 192.168.1.25
Subnet Mask 255.255.255.0
Mac Address 80:86:F2:01:1F:F5
2-
IP 192.168.2.50
Subnet Mask 255.255.255.0
B8:2A:72:04:0D:66

Ovviamente quando seleziono l’ interfaccia 1 invio i dati alle periferiche con l’ indirizzo IP 192.168.1.X mentre per il socket con
l’ interfaccia 2 l’ indirizzo IP 192.168.2.X

Destinatario interfaccia 1 = 192.168.1.201
Destinatario interfaccia 2 = 192.168.2.33

Ulteriori precisazioni:

  • Quando cerco di selezionare l’ interfaccia 2 (wifi) che non quella di default il programma funziona correttamente
  • Se non setto l’ interfaccia che voglio usare, il programma mi usa quella di “default” e la trasmissione dei dati avviene senza problemi.
    -Se setto l’ interfaccia da utilizzare che gi quella di default mi d gli errori sopra citati.

In entrambi i casi la porta d’ ascolto viene aperta dall’ interfaccia giusta.

Per ovviare ai problemi gi descritti non setto l’ interfaccia di default, ma
mi piacerebbe sapere con che criterio Xojo la seleziona: almeno per sapere che IP ho.

Nota: Speravo che una volta collegato il socket mi desse i parametri “Interface” ma mi restituisce comunque l’ oggetto vuoto.

Per poter compiere una qualsiasi comunicazione UDP non broadcast o TCP su ethernet e’ necessario inviare una richiesta ARP per ottenere il MAC address corrispondente all’IP del destinatario.
Questo non e’ un errore ma e’ la base del funzionamento IP su ethernet.

La documentazione riporta che “udp.networkinterface” viene utilizzata per definire su quale interfaccia eseguire il binding del socket.
Stando alla documentazione non e’ quindi possibile modificare l’interfaccia successivamente al binding (udp.connect) del socket.
E’ anche vero che se non viene eseguito il binding mediante “udp.connect” un tentativo di invio causa la generazione dell’errore 106 “InvalidStateError”.
Come vedi esiste un rapporto diretto tra socket ed interfaccia e il socket puo’ essere utilizzato solo dopo il binding.
A questo punto credo che l’unica soluzione se proprio devi (???) indicare l’interfaccia su cui inviare sia creare un socket per ogni interfaccia.

Con le funzioni socket tipo BSD/Winsock, quindi non il framework Xojo, e’ possibile utilizzare un solo socket su piu’ interfaccie.

Saluti.