Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 23
  1. #1

    [VB.Net 2008] Problema Socket

    Ciao, sono qui con un altro problema, questa volta inerente al listener del socket. il mio codice è questo:

    Private Sub RicezioneIP_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RicIP.Tick
    Dim buffer(1024) As Byte
    If Listener.Pending = True Then
    Messaggio = ""
    Dim SMS As String
    'Client = Listener.AcceptTcpClient()
    'Dim Reader As New StreamReader(Client.GetStream())
    Dim sok As Socket = Listener.AcceptSocket
    Dim BytedaLeggere As Integer = sok.Receive(buffer)
    Messaggio = Encoding.ASCII.GetString(buffer, 0, BytedaLeggere)

    TextBox1.Text = TextBox1.Text + Messaggio + vbCrLf

    sok.Close()

    SMS = Messaggio
    Dim l As Integer = SMS.Length

    ecc.
    il problema è questo:
    sia usando questo che usando il reader.peek andando dal client a mandare 16 byte a pressione di un tasto, e accellerando il "click" ad un certo punto sulla lettura dei byte:
    (Dim BytedaLeggere As Integer = sok.Receive(buffer)) genera un errore di questo tipo :

    Connessione in corso interrotta forzatamente dall'host remoto

    inizialmente utilizzando la funzione reader.peek sotto while davo la colpa alla lentezza della lettura. il timer di ricezione è a 1 ms, puo essere che mentre stia leggendo ancora il messaggio vecchio ne arriva uno nuovo e perdo la connessione perchè non accetto il socket al momento giusto? se fosse cosi come faccio a mettere apposto il tutto?
    grazie

  2. #2
    non programmo in vb ma in c#...ma da quello che vedo il tuo server supporta una connessione alla volta. poi vedo anche he leggi i dati ma non sai se ci sono o meno, utilizza un Poll sul socket per vedere se ci sono dati in entrata e dopo li leggi.

  3. #3
    ciao, sto prendendo spunto da questo
    http://forum.html.it/forum/showthrea...readid=1411365
    traducendolo in vb.
    alla load della form1 chiamo la sub della class principale. la form1 non fa lo show nel senso che textbox ecc non si vedono, tramite il mio client faccio una comunicazione sulla mia porta al che c'è un errore sul while( socket.connected) poichè mi ritorna NULL. ma il thread non dovrebbe girare in background a prescindere dall'errore di connessione?

  4. #4
    un'altra domanda, dopo aver gestito la comunicazione da quel thread è il caso di chiudere sia socket che thread? per bypassare il fatto del blocco nel while ho fatto questo:


    Private Sub RicezioneIP_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RicIP.Tick
    While Listener.Pending
    Dim soketforclient As Socket = Me.Listener.AcceptSocket
    ClientIP(soketClient)
    End While
    end sub

    non è molto bello vero?

  5. #5
    il pending non va benè perchè quel metodo se non sbaglio ti dice solo se ci sono connessioni in attessa di essere accettate o no, se non ci sono esci dal ciclo while e non accetti + connessioni.
    il metodo AcceptSocket invece resta in attesa fino a quando non c'è una connessione disponibile e l'accetta.

    per il problema di chiudere il socket:

    Se la tua omunicazione non è in streaming, cioè se devi effettuare un solo scambio di dati e poi chiudere la connessione, basta che togli il ciclo while, magary puoi utilizzare un try catch finally per assicurarti della chiusura del socket a fine trasmissione.

    Se la comunicazione è in streaming e decide il client quando chiudere il socket allora il codice che ho postato nell'altro thread ve bene, perchè alla chiusura della connessione la proprietà connected diventa false esce dal ciclo e termina anche il thread.
    Se invece la proprieà connected non si aggiorna immediatamente esce al ciclo successivo con il break;

  6. #6
    ok grazie. sto ragionando su una cosa. se io metto l'acceptsocket il programma si blocca fino a quando non arriva una connessione cosa per me inaccettabile poichè nella form ci sono altre cose da fare. Usando la funzione (anche se sbagliata) bypassavo questo problema e usando un timer come polling le cose "funzionavano". le "" sono poichè in questo punto nella gestione del thread sulla connessione :

    Public Sub Leggidati()
    Dim buf As Byte() = New Byte(1024) {}
    While (socket.Connected)
    'If socket.Connected = True Then
    If (socket.Poll(-1, SelectMode.SelectRead)) Then
    Dim BytedaLeggere As Integer = Me.socket.Receive(buf)
    Messaggio = ""
    Messaggio = Encoding.UTF8.GetString(buf)
    ecc,...


    mi riporta lo stesso problema di ieri sul Dim BytedaLeggere As Integer = Me.socket.Receive(buf) come host remoto ha terminato la connessione.
    Come posso mettere apposto il problema precedente del pending? cioè come posso aspettare una connessione non bloccando l'esecuzione della form?, e anche questo problema del blocco per la perdita di connessione.
    ti ringrazio molto!

  7. #7
    Hai provato così?
    codice:
    Application.DoEvents()
    Ciao

  8. #8
    Per evitare di bloccare il form basta utilizzare un altro thread per il metodo che accetta le connessioni.

    non mi è chiaro...cosa vuoi dire? che tipo di problema?
    mi riporta lo stesso problema di ieri sul Dim BytedaLeggere As Integer = Me.socket.Receive(buf) come host remoto ha terminato la connessione.

  9. #9
    quando ci sono messaggi veloci sul socket entra nel while

    While (socket.Connected)
    'If socket.Connected = True Then
    If (socket.Poll(-1, SelectMode.SelectRead)) Then
    Dim BytedaLeggere As Integer = Me.socket.Receive(buf)
    Messaggio = ""
    Messaggio = Encoding.UTF8.GetString(buf)

    passa If (socket.Poll(-1, SelectMode.SelectRead)) Then e poi il programma si blocca su
    Dim BytedaLeggere As Integer = Me.socket.Receive(buf) dando come errore l'host remoto ha interrotto la connessione.
    questo succede quando ci sono messaggi veloci da parte del client. ieri avevo bypassato il problema ( nella versione non multithread) tramite un try per gestire l'errore e non fare bloccare l'esecuzione del programma.
    il codice di "ieri" è:

    ' Dim buffer(1024) As Byte
    ' Dim codice As String = ""
    ' If Listener.Pending = True Then
    ' Dim MessaggioGenerico As String = ""
    ' Dim MessaggioGenerico1 As String = ""
    ' Dim sok As Socket = Listener.AcceptSocket
    ' Dim IpClient As String = CType(sok.RemoteEndPoint, IPEndPoint).Address.ToString

    ' If sok.Connected = True Then
    ' Try
    ' Dim BytedaLeggere As Integer = sok.Receive(buffer)
    ' Messaggio = Encoding.ASCII.GetString(buffer, 0, BytedaLeggere)

  10. #10
    no anche con il doevents si blocca aspettando una connessione tcpip dando poi il messaggio di errore :
    Connessione in corso interrotta forzatamente dall'host remoto
    sul receive

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.