Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it L'avatar di jesus
    Registrato dal
    Jan 2002
    Messaggi
    717

    [VB] Utilizzo di winsock sullo stesso PC

    Salve utenti del forum volevo chiedervi una cosa.

    Ho una form con due controlli winsock, uno per inviare e uno per ricevere. Vorrei che premendo un bottone il socket di invio si connettesse a quello di ricezione.

    Il mio problema è che non scatta l'evento ConnectionRequest.

    Questo è il codice della mia pagina:
    codice:
    Option Explicit
    
    Private Sub Command1_Click()
      If (sOut.State <> sckClosed) Then sOut.Close
      sOut.LocalPort = 0
      sOut.RemoteHost = "169.254.69.123"
      sOut.RemotePort = 10000
      sOut.Connect
    End Sub
    
    Private Sub Form_Load()
      sIn.LocalPort = 10000
      sIn.Listen
    End Sub
    
    Private Sub sIn_ConnectionRequest(ByVal requestID As Long)
      MsgBox "connesso!"
    End Sub
    Quale potrebbe essere il problema?
    <%= Jesus %>
    "Non hai veramente capito qualcosa fino a quando non sei in grado di spiegarlo a tua nonna" - Albert Einstein.

  2. #2
    WS è il mio WINSOCK del server
    codice:
    Private Sub WS_ConnectionRequest(ByVal requestID As Long)
            WS.Close
            WS.Accept requestID
    End Sub
    Questo invece il pulsante che mi fa collegare il client al form server
    codice:
    Private Sub CmdConnect_Click()
        porta = InputBox("Digitare il numero della porta","Richiesta informazioni")
        ipserver = InputBox("Digitare l'ip del server", "Richiesta informazioni")
        ws.Connect ipserver, porta
    End Sub
    I dati che mandi li mandi con ws.senddata i dati che arrivano li gestisci in WS_DataArrival

  3. #3
    Utente di HTML.it L'avatar di jesus
    Registrato dal
    Jan 2002
    Messaggi
    717
    io ho creato due oggetti winsock nello stesso form, uno per l'invio e uno per la ricezione.
    Il problema è che quando richiamo il metodo Connect mi dovrebbe scattare l'evento sIn_ConnectionRequest, invece non lo fa.

    Devo per forza avere due form distinte?
    <%= Jesus %>
    "Non hai veramente capito qualcosa fino a quando non sei in grado di spiegarlo a tua nonna" - Albert Einstein.

  4. #4
    io sono principiante anche io ma due winsock sullo stesso form non li ho mai provati. Posso chiedere a cosa possono mai servire?
    Io i due winsock li ho uno su un form di un'applicazione diversa, cioe' sono due programmi distinti che comunicano tra loro, uno funge da server e l'altro da client, diciamo una sorta di chat

  5. #5
    Utente di HTML.it L'avatar di goku370
    Registrato dal
    Oct 2003
    Messaggi
    569
    Io ho modificato il tuo codice di partenza così :

    codice:
    Private Sub Command1_Click()
      If (sOut.State <> sckClosed) Then sOut.Close
      sOut.LocalPort = 0
      sOut.RemoteHost = sOut.LocalIP
      sOut.RemotePort = 10000
      sOut.Connect
    End Sub
    Cioè, invece di scrivere il tuo indirizzo IP metti SOut.LocalIP (indirizzo IP della macchina su cui viene eseguito il programma).
    Naturalmente la cosa vale solo se ti "autoinvii" la richiesta di connessione ma se la richiesta la devi mandare ad un altro PC devi inserire il suo indirizzo IP....

    Non so se mi sono spiegato....

  6. #6
    Utente di HTML.it L'avatar di jesus
    Registrato dal
    Jan 2002
    Messaggi
    717
    il mio scopo è creare un programma che sia in grado sia di inviare che di ricevere fra due computer.
    Stamattina ho messo il programma su un'altro pc, e ho debuggato con VB sul mio pc, e l'evento scatta.

    Grazie comunque dell'aiuto a me interessava questo.

    Ciao, buona giornata.
    <%= Jesus %>
    "Non hai veramente capito qualcosa fino a quando non sei in grado di spiegarlo a tua nonna" - Albert Einstein.

  7. #7
    Utente di HTML.it L'avatar di jesus
    Registrato dal
    Jan 2002
    Messaggi
    717
    Scusatemi ancora ragazzi.

    Devo creare un'applicativo in grado di trasferire file fra due computer. Volevo sapere se uno stesso programma (diciamo un exe) può funzionare sia come client che come server.
    Cioè quando il programma su un computer A vuole inviare file al computer B, lo stesso programma nel computer B deve funzionare come server cioè come ricevitore di file e viceversa.

    E' possibile una cosa del genere oppure devo per forza creare duie eseguibili distinti?

    Grazie dell'attenzione, saluti.
    <%= Jesus %>
    "Non hai veramente capito qualcosa fino a quando non sei in grado di spiegarlo a tua nonna" - Albert Einstein.

  8. #8
    Utente di HTML.it L'avatar di goku370
    Registrato dal
    Oct 2003
    Messaggi
    569
    Credo sia perfettamente possibile...
    e diventa più facile fare una cosa del genere se metti nella tua applicazione due winsock come avevi fatto prima ( uno dedicato alla ricezione e uno alla trasmissione).....

    Ciao

  9. #9
    goku ma per trasferire file tramite il winsock sai qualche guida? mi piacerebbe poter inviare immagini tramite la minichat che stavo provando, sapresti dirmi dove posso prendere qualche info?
    Per il trasferimento del testo della chat non ci sono problemi ma come inviare file?
    Il concetto dovrebbe essere che apro il file sul computer che invia... e manda quello che c'e' scritto dentro al computer che riceve che crea un file con lo stesso nome e con il contenuto che riceve dal computer inviante.... è questo il concetto? esiste un modo per renderlo fattibile?

  10. #10
    Utente di HTML.it L'avatar di jesus
    Registrato dal
    Jan 2002
    Messaggi
    717
    Ciao ragazzi ho ancora problemi con winsock.

    Ho creato due classi VB, clsSockOut (per la trasmissione) e clsSockIn (per la ricezione).

    In clsSockOut ho:
    codice:
    Private Const cpn_OUT_REM_PORT = 1500
    
    Private vpsConnType      As String          ' tipo connessione corrente
    Private vpsClient        As String          ' num di telefono o indirizzo IP
    Private vpsPath          As String          ' path contenente i file da inviare/ricevere
    Private vpoOutFiles      As New Collection  ' collection dei file da inviare
    Private vpnFileHandleOut As Long            ' Handle del file da inviare (in trasmissione)
    Private vpsFileOut       As String          ' Percorso del file da salvare
    
    
    Private WithEvents vpoSockOut   As Winsock    ' socket trasferimento file
    Private WithEvents vpoSockOutCn As Winsock    ' socket controllo trasferimento file
    
    (...)
    
    Private Sub Class_Initialize()
      (...)
      ' inizializzazione oggetti winsock
      Set vpoSockOutCn = New Winsock
      vpoSockOutCn.Protocol = sckTCPProtocol
      Set vpoSockOut = New Winsock
      vpoSockOut.Protocol = sckTCPProtocol
    End Sub
    
    (...)
    
    Public Function Send() As Boolean
      Dim vsIPClient As String
      Dim vloItem As Variant
      
      ' crea l'elenco dei file
      fpoOutFiles vpoOutFiles, vpsPath
      ' imposta destinazione dei file
      vsIPClient = vpsClient
      
      With vpoSockOutCn
        ' connessione sock controllo (invio)
        If (.State <> sckClosed) Then .Close
        .LocalPort = 0
        .Connect vsIPClient, cpn_OUT_REM_PORT
        ' invio dei file
        For Each vloItem In vpoOutFiles
          ' il formato di invio è CMD:"/FILE" NAME:"nome del file da inviare" DIM:"dimensione"
          vpsFileOut = vpsPath & fpsGetAttr("NAME:", vloItem)
          If (.State <> sckConnected) Then Exit Function
          .SendData vloItem
        Next
      End With
    End Function
    In clsSockOut ho:
    codice:
    Private Const cpn_IN_LOC_PORT = 1500
    
    Private vpsConnType      As String          ' tipo connessione corrente
    Private vpsClient        As String          ' num di telefono o indirizzo IP
    Private vpsPath          As String          ' path contenente i file da inviare/ricevere
    Private vpnFileHandleIn  As Long            ' Handle del file da salvare (in ricezione)
    Private vpsFileIn        As String          ' Percorso del file da salvare
    
    Private WithEvents vpoSockIn    As Winsock    ' socket ricezione file
    Private WithEvents vpoSockInCn  As Winsock    ' socket controllo ricezione file
    
    Private Sub Class_Initialize()
      ' inizializzazione dei parametri
      (...)
      ' inizializzazione oggetti winsock
      Set vpoSockInCn = New Winsock
      vpoSockInCn.Protocol = sckTCPProtocol
      Set vpoSockIn = New Winsock
      vpoSockIn.Protocol = sckTCPProtocol
      ' setta socket ricezione controllo in ascolto
      With vpoSockInCn
        .LocalPort = cpn_IN_LOC_PORT
        .Listen
      End With
    End Sub
    
    Private Sub vpoSockInCn_ConnectionRequest(ByVal requestID As Long)
      With vpoSockInCn
        .Close
        .Accept requestID
      End With
    End Sub
    
    Private Sub vpoSockInCn_DataArrival(ByVal bytesTotal As Long)
      Dim vlvDati()   As Byte
      Dim vlsCmd      As String
      Dim vlnFileDim  As Long
      Dim vlsRisp     As String
      
      vpoSockInCn.GetData vlvDati
      vlvDati = StrConv(vlvDati, vbUnicode)
      vlsCmd = fpsGetAttr("CMD:", vlvDati)
      
      Select Case (vlsCmd)
        Case "/FILE"
          vpsFileIn = fpsGetAttr("NAME:", vlvDati)
          vlnFileDim = CLng(fpsGetAttr("DIM:", vlvDati))
          With vpoSockIn
            If (.State <> sckClosed) Then .Close
            .LocalPort = 0
            .Listen
            vlsRisp = "CMD:<+OK PORTA> PORTA:<" & .LocalPort & ">"
            vpoSockInCn.SendData vlsRisp
          End With
        Case Else
          ' comando non riconosciuto
      End Select
    End Sub
    Il funzionamento è questo:
    Richiamando il metodo "Send" della classe clsSockOut io mi connetto al socket di ricezione con il metodo
    .LocalPort = 0
    .Connect vsIPClient, cpn_OUT_REM_PORT

    di conseguenza scatta l'evento vpoSockInCn_ConnectionRequest sulla classe clsSockIn (su un'altro PC)
    di seguito quando devo inviare dati tramite l'istruzione .SendData vloItem presente nella classe clsSockOut nel metodo Send l'evento vpoSockInCn_DataArrival non scatta come invece dovrebbe.

    Dove sbaglio? Perchè a connetersi si connette ma ad inviare dati no?

    Grazie, saluti.
    <%= Jesus %>
    "Non hai veramente capito qualcosa fino a quando non sei in grado di spiegarlo a tua nonna" - Albert Einstein.

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.