Oppure

Loading
03/06/08 17:23
klez91
Salve! Scusate se posto in questa sezione spero sia giusta. Il mio problema è che sto scrivendo una chat in vb.net (di cui sotto il sorgente) e finquando faccio delle prove sul mio pc mettendo il mip Ip tutto funziona bene ma quando sono andato a fare delle prove con diversi miei amici nn sono riuscito a connettermi al server di nessuno di loro. Dopo numerosi tentativi, ho scoperto che facendo il ping dei loro indirizzi IP ricevo come output "Richiesta scaduta" mentre invece loro riescono a pingare il mio IP senza problemi. Mi chiedevo come è possibile ? In ogni caso ecco il codice del client...
Imports System.Net.Sockets
Public Class Form1
    Public Client As New TcpClient
    Public NetStr As NetworkStream
    Private Sub tmrGetData_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles tmrGetData.Tick
        If Client.Connected Then
            If Client.Available > 0 And NetStr.CanRead Then
                Dim Bytes(Client.ReceiveBufferSize) As Byte
                NetStr.Read(Bytes, 0, Client.ReceiveBufferSize)
                Dim S As String = System.Text.ASCIIEncoding.ASCII.GetString(Bytes)
                txtRicevuto.Text = S
            End If
        End If
    End Sub
    Private Sub cmdSend_Click(ByVal sender As Object, _
      ByVal e As EventArgs) Handles cmdSend.Click
        If Client.Connected Then
            If NetStr.CanWrite Then
                Dim Bytes() As Byte = _
                System.Text.ASCIIEncoding.ASCII.GetBytes(txtSend.Text)
                NetStr.Write(Bytes, 0, Bytes.Length)
            End If
        End If
        txtSend.Text = ""
    End Sub
    Private Sub cmdConnetti_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdConnetti.Click
        Client.Connect(txtIP.Text, 4156)
        If Client.Connected Then
            NetStr = Client.GetStream
            cmdConnetti.Text = "Disconnetti"
            cmdConnetti.Name = "cmdDisconnetti"
        End If
    End Sub
End Class


... e quello del server....
Imports System.Net.Sockets
Public Class Form1
    Public Client As New TcpClient
    Public NetStr As NetworkStream
    Public Listener As New TcpListener(4156)
    Private Sub tmrControlConnection_Tick(ByVal sender As Object, _
      ByVal e As EventArgs) Handles tmrControlConnection.Tick
        If Listener.Pending Then
            Client = Listener.AcceptTcpClient
            NetStr = Client.GetStream
            tmrControlConnection.Stop()
            Listener.Stop()
            tmrGetData.Start()
        End If
    End Sub
    Private Sub Form1_Load(ByVal sender As Object, _
      ByVal e As EventArgs) Handles MyBase.Load
        Listener.Start()
    End Sub
    Private Sub tmrGetData_Tick(ByVal sender As Object, _
       ByVal e As EventArgs) Handles tmrGetData.Tick
        If Client.Connected Then
            If Client.Available > 0 And NetStr.CanRead Then
                Dim Bytes(Client.ReceiveBufferSize) As Byte
                NetStr.Read(Bytes, 0, Client.ReceiveBufferSize)
                Dim S As String = System.Text.ASCIIEncoding.ASCII.GetString(Bytes)
                txtReceved.Text = S
            End If
        End If
    End Sub
    Private Sub cmdSend_Click(ByVal sender As Object, _
      ByVal e As EventArgs) Handles cmdSend.Click
        If Client.Connected Then
            If NetStr.CanWrite Then
                Dim Bytes() As Byte = _
                System.Text.ASCIIEncoding.ASCII.GetBytes(txtSend.Text)
                NetStr.Write(Bytes, 0, Bytes.Length)
            End If
        End If
    End Sub
End Class


Ho l'adsl tele2 nn so se possa servire. Scusate per il post un po lunghetto... grazie a tutti ;)!
aaa
04/06/08 15:05
Il Totem
Quello sembra proprio il mio codice. L'hai preso dal mio sito?
Comunque, appare strano quello che dici. Intanto, prova a cambiare porta e disattivare il firewall (se non l'ha già fatto). Può darsi che sia quello che blocchi la connessione.

PS: ho supposto che il timer sia attivo all'avvio, è vero?
Ultima modifica effettuata da Il Totem 04/06/08 15:06
aaa
04/06/08 18:08
klez91
Innanzitutto volevo complimentermi per la tua guida la trovo molto interessante e sopratutto ben organizzata, è da lì che ho cominciato e continuo lo studio del vb.net grazie. Si è vero mi hai sgamato :rotfl: il sorgente l'ho preso dal tuo sito. Comunque penso che sia apposto perché come ho gia detto aprendo client e server sul mio stesso pc riesco a farli comunicare senza alcun problema. Per quanto riguarda il firewall viene consentita l'apertura della porta(non viene disattivato in quanto pensavo fosse sufficiente aprire la porta comunque in questi giorni farò delle prove disattivandolo). Io penso che il problema sia quella maledetta "richiesta scaduta" che ricevo quando vado a pingare l'IP al quale non riesco a connettermi, mentre gli altri pingando il mio IP non ricevono alcun errore e tutto fila liscio. Siccome gli "altri" sono molti sono giunto alla conclusione che forse è un problema mio, ma nn so ripeto ho l'adsl tele2. Ho provato anche ad utilizzare un DNS(no-ip.com) ma niente. Ecco perché mi chiedevo se esistesse un modo per ovviare a questo problema, che ne so magari modificando da codice la configurazione internet (se è questo il preblema) del pc che ospita il server affiché possa ricevere connessioni in entrata. Rispondi please e grazie ancora per la disponibilità ;)!
aaa
04/06/08 21:39
gantonio
Molto probabilmente il problema e' dai tuoi amici.

Se il server lo attivi da un tuo amico, questo deve avere aperto la porta che utilizzate sul suo router.
aaa
05/06/08 11:03
klez91
@ gantonio
grazie x la risposta ma coloro con i quali ho provato avevano tutti un modem normale...

--------------------------------------------------

Comunque ho risolto, disattivando completamente il firewall come mi hai detto tu Totem, riesco a pingare senza problemi l'Ip, e riesco a connettermi e a far funzionare il programma senza alcun problema. Però adesso mi chiedo perché non bastava consentire l'eccezione del firewall aprendo la porta, ma bisogna disattivare completamente il firewall ??????? Poi un'altra cosa se nn è possibile risolvere questo problema(di disattivare il firewall ogni volta che si vuole fare una connessione) esiste un modo per disattivarlo da codice(intendo comunque sempre quello di windows, visto che con quello si può aprire una porta dal semplice prompt dei comandi) x poi magari riattivarlo quando termina la connessione ??????
aaa
05/06/08 14:08
Il Totem
Buona domanda. Teoricamente basterebbe un'eccezione, che, se non ricordo male, si può aggiungere anche da codice, ma come dici tu non basta. Sinceramente non lo so: Gantonio è più esperto di me in termini di reti e socket. Comunque non credo sia possibile disattivarlo da codice, altrimenti sarebbe facilissimo scavalcarlo, no? Puoi però chiedere all'utente di disattivarlo manualmente, se proprio non riesci a trovare una soluzione.
aaa
05/06/08 16:11
gantonio
Disattivare il firewall da codice non ha senso.

E' troppo pericoloso e sarebbero necessari diritti amministrativi che non tutti i programmi possiedono.

Una eccezione e' sufficiente. Questo vuol dire che quello che avevi fatto tu nel configurare il fw non era corretto.
aaa
06/06/08 10:21
klez91
Continuo a non capire come mai l'eccezione non basti....Vabbè comunque grazie al vostro aiuto ho capito che la radice del problema stava nel firewall quindi il lavoro più grosso è stato fatto, adesso si tratta solo di risolvere questo piccolo problema. Grazie ancora alla prossima:k:!
aaa