Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - sincronizzare due udpclient
Forum - C# / VB.NET - sincronizzare due udpclient

Avatar
peppuce (Normal User)
Newbie


Messaggi: 1
Iscritto: 15/12/2011

Segnala al moderatore
Postato alle 17:48
Giovedì, 15/12/2011
Ciao a tutti.
Dato che è il mio primo messaggio ne approfitto per complimentarmi con tutti quelli che contribuiscono a questo forum e spero di diventare anche io uno di voi.

Vi spiego la mia questione:

devo scrivere un programma che consenta a due computer di inviare e ricevere messaggi di testo (tipo chat). Dato che sono nuovo alla programmazione di rete, mi sono studiato un pò un manuale (Network programming in .NET) e ho pensato di realizzare l'applicazione usando degli udpclient.

Il mio problema è questo: un computer si connette ad internet con un router senza dhcp, mentre sull'altro ho il dhcp e ho impostato il port forwarding.

nel programma che ho scritto, il computer in dhcp avvia la connessione con l'altro (e fin qui va bene, perchè conosce quale porta sfruttare), e il messaggio viene ricevuto...ora come faccio dall'altra parte a rispondere?
ho pensato (erroneamente, perchè non funge :) ) di sfruttare l'udpClient che uso per ricevere anche per spedire, solo che nel momento in cui provo a spedire mi dice che l'udpclient non è connesso...non so se mi sono spiegato...

non c'è un modo per sincronizzare i due udpclient in modo che venga creato un "canale" di comunicazione tra i due computer?

un'altra cosa che non ho capito: ma la connessione che stabilisco con il metodo udpclient.connect(...) resta aperta finchè non la chiudo o finchè non termina la sub in cui è stata invocata?

si accettano anche soluzioni alternative...

Grazie mille!

@nessuno, ecco il codice

parte x il computer senza il dhcp


Public Class form1

    Public myUdpClient As New UdpClient(8081)
    'Parte delegata alla ricezione di dati

    Public Sub myServerSub()

        Dim remoteIpEndPoint As New IPEndPoint(IPAddress.Any, 0)
        Dim receiveBytes As Byte()
        Dim rIPad As String

        receiveBytes = myUdpClient.Receive(remoteIpEndPoint)
        Dim returnData As String = Encoding.ASCII.GetString(receiveBytes)
        rIPad = remoteIpEndPoint.Address.ToString()
        rIPad = rIPad + ":" + " "

        ListaRicevuti.Items.Add(rIPad + returnData.ToString())


    End Sub


    'Funzione che inizializza la connessione udp
    Private Sub udpConBut_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles udpConBut.Click
        connettiUdp()
    End Sub


    Private Sub connettiUdp()
        Dim sendbytes As Byte()
        Dim iEr As Integer = 0

        'Provo a stabilire la connessione
        Try
            myUdpClient.Connect(IPtb.Text, 1234)
        Catch e As Exception
            iEr = 1
        End Try

        If iEr = 0 Then
            sendbytes = Encoding.ASCII.GetBytes("Hello")
            myUdpClient.Send(sendbytes, sendbytes.Length)

            'Avvio la routine del server per mettermi in ascolto
            myServerSub()
        End If

    End Sub
[\code]

già così (cioé scambiando solo due messaggi) non funziona...il primo arriva, mentre il secondo mi dice di non essere connesso

parte per il computer con dhcp

Public Class Form1
    Dim uClient As New UdpClient(8081)

    Private Sub spedisciUDP(ByVal messaggio As String)

        Dim sendbytes As Byte()

        sendbytes = Encoding.ASCII.GetBytes(messaggio)
        uClient.Send(sendbytes, sendbytes.Length)

    End Sub

    Public Sub serverThread()

            Dim remoteIpEndPoint As New IPEndPoint(IPAddress.Any, 0)
            Dim receiveBytes As Byte()
            Dim rIPad As String

            receiveBytes = uClient.Receive(remoteIpEndPoint)
            Dim returnData As String = _
            Encoding.ASCII.GetString(receiveBytes)
            lbRicev.Items.Add(" ")
            rIPad = remoteIpEndPoint.Address.ToString()
            rIPad = rIPad + ":" + " "

            lbRicev.Items.Add(rIPad + returnData.ToString())

    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim thUdpServer As New Thread(New ThreadStart(AddressOf serverThread))
        thUdpServer.Start()

    End Sub

    Private Sub btnIstInv_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnIstInv.Click
        spedisciUDP(tbIstr.Text)
    End Sub
End Class

[\code]
sono codici molto standard...nel primo ho preferito non mettere thread perchè è lui a connettersi...non dovrebbe passare molto tempo in attesa di una risposta...grazie per eventuali consigli!

Ultima modifica effettuata da peppuce il 16/12/2011 alle 9:40
PM
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Up
3
Down
V
Segnala al moderatore
Postato alle 23:16
Giovedì, 15/12/2011
credo che proprio i tuoi presupposti siano sbagliati, non si può parlare di "connessione" se utilizzi il protocollo UDP.
Faresti meglio ad usare TcpClient :)

accidenti...il fatto è che su quel libro non si capisce un fico secco...non mi potresti suggerire una guida? grazie - peppuce - 16/12/11 09:46
http://www.codeproject.com/KB/IP/tcpclientserver.aspx - HeDo - 16/12/11 11:21
http://www.switchonthecode.com/tutorials/csharp-tutorial-simple-threaded-tcp-server - HeDo - 16/12/11 11:33
Grazie mille! - peppuce - 16/12/11 15:10
PM
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Up
2
Down
V
Segnala al moderatore
Postato alle 20:46
Giovedì, 15/12/2011
Mostra il codice che usi ...

ok, il codice è questo - peppuce - 16/12/11 09:32
Grazie lo stesso, ho risolto con i TCPClient - peppuce - 16/12/11 15:10


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM