PDA

View Full Version : [VB.NET] Invio WOL


daxdaxdax
25-10-2009, 12:11
Ciao a tutti,
premetto che ho iniziato da poco a programmare con vb.net..
Ho girato dappertutto e non ho trovato una spiegazione esauriente per quanto riguarda l'invio del pacchetto Wake On Lan in ambiente VB.net, chi sarebbe così gentile da darmi una dritta?
Grazie in anticipo

daxdaxdax
25-10-2009, 21:12
Ho capito (forse) solo una cosa... devo usare asocket.dll.
L ho trovata in rete ma non so come gestirla...

Kralizek
26-10-2009, 08:44
Googlando ".net wake on lan (http://www.google.com/#hl=en&source=hp&q=.net+wake+on+lan&aq=f&aqi=&oq=&fp=b8148470ea1f7ec2)", il primo risultato (http://community.bartdesmet.net/blogs/bart/archive/2006/04/02/3858.aspx) ha un codice perfettamente funzionante che usa solo codice managed*.

*nel senso che tu non devi importare dll non managed.

Puoi usare questo tool per tradurre da C# a VB.NET: http://www.developerfusion.com/tools/convert/csharp-to-vb/

daxdaxdax
26-10-2009, 21:23
Gentilissimo, grazie, provo all istante!!

daxdaxdax
26-10-2009, 21:50
non riesco ad integrarlo correttamente nel mio codice... :confused:

Kralizek
26-10-2009, 21:54
eh?

daxdaxdax
26-10-2009, 22:28
hihihihii..

mi da sempre errore la stringa "Namespace WakeOnLan", di conseguenza non funziona. Non mi è chiaro poi come integrare l evento
button1click -> wakeOnLan form2.textbox1.text

googlerò ancora un pochino.. grazie ancora

MarcoGG
27-10-2009, 14:43
L'esempio citato da Kralizek è buono.
Certo l'autore non si è sbattuto più di tanto per renderlo facilmente riutilizzabile. Il MAC Address necessario all'operazione solitamente arriva nel formato xx-xx-xx-xx-xx-xx ( Prompt / ipconfig/all ), in altri casi nel formato xx:xx:xx:xx:xx:xx, e così via, perciò non è proprio "alla mano" un Mac in formato array di Byte...

Personalmente tradurrei / risolverei così, ipotizzando una semplice WinForm in VB.NET con una textbox ( "txt_mac" ) in cui inserire il Mac Address della Macchina da "svegliare", e un pulsante per avviare il tutto :

1. La Sub :

Private Sub WakeUp(ByVal mac As Byte())

' WOL packet is sent over UDP 255.255.255.0:40000.
Dim client As New Net.Sockets.UdpClient()
client.Connect(Net.IPAddress.Broadcast, 40000)

' WOL packet contains a 6-bytes trailer and 16 times a 6-bytes sequence containing the MAC address.
Dim packet As Byte() = New Byte(17 * 6 - 1) {}

' Trailer of 6 times 0xFF.
For i As Integer = 0 To 5
packet(i) = &HFF
Next

' Body of magic packet contains 16 times the MAC address.
For i As Integer = 1 To 16
For j As Integer = 0 To 5
packet(i * 6 + j) = mac(j)
Next
Next

' Submit WOL packet.
client.Send(packet, packet.Length)

End Sub

2. Codice per il pulsante :

If txt_mac.Text = "" Then Exit Sub

Dim arrayChrsSplit As Char() = {" ", ":", "-", "_", "/", "\"}
Dim arrayMac As String() = txt_mac.Text.Split(arrayChrsSplit)

Dim mac(arrayMac.Length - 1) As Byte
For i As Integer = 0 To mac.Length - 1
mac(i) = Convert.ToByte(Long.Parse(arrayMac(i), Globalization.NumberStyles.HexNumber))
Next

WakeUp(mac)

;)

daxdaxdax
27-10-2009, 17:19
Ok marco ti ringrazio molto, provo e posto risultato.:D

daxdaxdax
27-10-2009, 17:55
Caro Marco,
il tutto funziona perfettamente, non so come ringraziarti!!
Spero di diventare bravo come te\voi :p

daxdaxdax
27-10-2009, 18:01
Dato che siamo in tema,
qualcuno di voi saprebbe dirmi come posso fare per vedere del testo contenuto in un file txt all interno di una textbox, essendo il file in questione aperto da un altro processo? Ho provato diverse soluzioni ma ognuna risponde con errore di file aperto da un altro processo... (in pratica "intercettare" un file di LOG generato da un applicazione in esecuzione)
Non volendo approfittare di voi, mi basta anche solo una dritta.

MarcoGG
27-10-2009, 18:50
Dato che siamo in tema,
qualcuno di voi saprebbe dirmi come posso fare per vedere del testo contenuto in un file txt all interno di una textbox, essendo il file in questione aperto da un altro processo? Ho provato diverse soluzioni ma ognuna risponde con errore di file aperto da un altro processo... (in pratica "intercettare" un file di LOG generato da un applicazione in esecuzione)
Non volendo approfittare di voi, mi basta anche solo una dritta.

Molto dipende da COME l'applicazione o processo gestisce il Log e il relativo file. Se lo apre con accesso esclusivo, se lo tiene sempre aperto, se lo apre ogni tot di tempo, o solo all'occorrenza, ci scrive, lo salva e lo richiude...

Puoi provare a inserire le istruzioni critiche di accesso a quel file in un blocco Try Catch, magari all'interno di un metodo che viene eseguito periodicamente...

daxdaxdax
30-10-2009, 21:51
Io non ci riesco....ufff cosa sbaglio?

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
If RadioButton1PLAY.Checked = True Then

'Leggo file da percorso in label5
Try
TextBox1.Text = IO.File.ReadAllText(Form1.Label5.Text)
Catch ex As Exception
End Try
TextBox1.Focus()
TextBox1.ScrollToCaret()

Else

End If
End Sub


Vorrei leggere ogni secondo un file.log in textbox1 e splittare (credo:confused: ) le righe che iniziano con "New Player" in textbox2.text

MarcoGG
31-10-2009, 09:23
Perchè "Form1.Label5.Text" ?
Se il codice Timer sta su Form1, è inutile. Se invece vi fai riferimento da altra Form, non va.
Form1 è la classe, non l'oggetto...

daxdaxdax
31-10-2009, 11:12
perchè il percorso del file da leggere è contenuto nella label5 nel form1.... non va bene? la lettura la fa quando il file in questione non viene aperto dal suo processo "di nascita"...

MarcoGG
31-10-2009, 12:44
perchè il percorso del file da leggere è contenuto nella label5 nel form1.... non va bene?

No, non va bene. Qui non siamo in VB6.
Che VB.NET poi chiuda un occhio e lo faccia funzionare lo stesso è un altro discorso. Il senso della mia critica era :

1. Se Timer1 si trova su Form1, è inutile specificare Form1.Label5...

2. Se Timer1 non è su Form1, è incorretto riferirsi alla classe Form1. ( se VB.NET "alla VB6" lo tollera, non è comunque accettabile in .NET ).

Detto questo, il tuo codice funziona, non ho chiaro cosa possa andare storto, se non ricevi messaggi di errore e non leggi niente dal log, evidentemente ciò che hai messo nel Try Catch non va a buon fine, perciò intercetta il msg d'errore e vedi cos'è.

daxdaxdax
31-10-2009, 12:55
ok grazie!!

come posso fa andare in textbox2 automaticamente le righe che iniziano con "new player"?

MarcoGG
31-10-2009, 13:37
ok grazie!!

come posso fa andare in textbox2 automaticamente le righe che iniziano con "new player"?

Anzichè fare un .ReadAllText, puoi eseguire una lettura linea per linea, una volta sola.
Alla TextBox1 mandi tutte le linee lette, mentre alla TextBox2 ( controllandole con una substring... ) solo quelle che iniziano con la substring desiderata.
Ad esempio vedi qui :
http://www.hwupgrade.it/forum/showthread.php?t=2076458
[ mio post #7 ]
tralasciando la gestione della ProgressBar... ;)

daxdaxdax
31-10-2009, 13:46
sempre disponibile!

guardo subito, grazie ;)