Newsgroup: it.comp.lang.visual-basic
Titolo: domanda su winsock

Salve a tutti !
ho il seguente problema con la gestione del winsock
immaginiamo
utente -->  su pc1
utente -->  su pc2
su questi pc c'č un programmino con due winsock (IN e OUT) che quando
lanciato si mette in ascolto (IN) sulla porta 1500 e non ritorna l'eco di
OUT se l'ip del winsock č lo stesso.
pc1 fa richiesta di connessione a pc2 (metodo connect)
pc2 riceve il messagio e accetta (metodo accept)
la connessione si "dovrebbe stabilire".....
ora, la mia domanda č: per quale motivo non riesco a rendere la
comunicazione full-duplex?
solo nei casi migliori ottengo che uno dei due riesca a parlare.........
l'altro ascolta e basta!!
triste storia.
ringrazio chiunque sappia aiutarmi o farmi notare miei errori.

l'altro ascolta e basta!!
mi sembra una configurazione normale tra client e server... se tu vuoi
che la risposta sia inviata dal server al client IMHO devi rilevarla con
l'evento winsock_DataArrival o qualcosa del genere, che processa la
ricezione di un dato. Per inviare invece, usa il metodo SendData.
Ciao!
Davide
-- 
Volontario Anti-Troll (TM) 
SecurFaq: 
http://members.nbci.com/gouldukat/
DocTrolls: 
http://it.geocities.com/roccopapaleo/faq/italiano/Troll.html
Netiquette: 
http://www.inferentia.it/netiquette/dis.html

 >ora, la mia domanda è: per quale motivo non riesco a rendere la


 ha scritto nel messaggio
news:9jmkfb$2n33$1...@phobos.ibnetwork.net...


 modo tale che anche lui possa parlare al chiamante! e non solo il
contrario!
Credo che il tutto derivi da un'impostazione errata del problema.
Prova cosi', apri un nuovo progetto ed inserisci nel form:
1) un controllo winsock che chiamerai W1 con Index=0
2) un textbox Text1 con proprieta' multiline = true
3) un textbox Text2 che conterra'  la stringa del RemoteHost, tipo 90.0.30.1
4) un commandbutton
taglia e copia il codice sottoriportato
L'esempio che posto ti serve solo per capire le logiche di trasmissione e
ricezione per mezzo di winsock.
Considera che l'ocx cosi' come e' strutturato non facilita molto la vita se
utilizzato per mezzo degli eventi che genera, molto meglio sfruttare i
metodi messi a disposizione che sono piu' facilmente temporizzabili.
Occorre fare attenzione allo stato della connessione mediante il controllo
della proprieta' .state del socket oltre alla gestione del timeout.
Tieni presente inoltre che quando si crea un'applicazione client-server
occorre studiare attentamente a priori il protocollo di comunicazione, dopo
di che il lavoro viene notevolmente semplificato. Io ho banalizzato la
trasmissione con semplici frasi e il controllo sulle stesse in ricezione, in
realta' difficilmente la comunicazione viene utilizzata per questi scopi.
Option Explicit
    Dim FlagServer As Boolean, Indice As Integer
    Const Porta = 2000
    Const TimeOut = 5
Private Sub Command1_Click()
    W1(Indice).Close
    Unload W1(Indice)
    Indice = Indice + 1
    Load W1(Indice)
    FlagServer = False
    W1(Indice).Connect Text2, Porta
End Sub
Private Sub Form_Load()
    Indice = 1
    Load W1(Indice)
    FlagServer = True
    W1(Indice).LocalPort = Porta
    W1(Indice).Listen
End Sub
Private Sub Form_Unload(Cancel As Integer)
    W1(Indice).Close
    Unload W1(Indice)
End Sub
Private Sub W1_Close(Index As Integer)
    If FlagServer = False Then
        W1(Indice).Close
        FlagServer = True
        Unload W1(Indice)
        Indice = Indice + 1
        Load W1(Indice)
        W1(Indice).LocalPort = Porta
        W1(Indice).Listen
    End If
End Sub
Private Sub W1_Connect(Index As Integer)
    Partenza
End Sub
Sub W1_ConnectionRequest(Index As Integer, ByVal requestID As Long)
    W1(Indice).Close
    W1(Indice).Accept requestID
    Do While W1(Indice).State <> 7
        DoEvents
    Loop
    Partenza
    If FlagServer = True Then
        W1(Indice).Close
        Unload W1(Indice)
        Indice = Indice + 1
        Load W1(Indice)
        W1(Indice).LocalPort = Porta
        W1(Indice).Listen
    End If
End Sub
Function Ciclo() As Integer
    Dim Valore As Integer
    If FlagServer = True Then
        If (Trasmetti("Ciao", Valore)) Then Ciclo = Valore: Exit Function
        If (Ricevi("Salve", Valore)) Then Ciclo = Valore: Exit Function
        If (Trasmetti("bella giornata", Valore)) Then Ciclo = Valore: Exit
Function
        If (Ricevi("qui piove", Valore)) Then Ciclo = Valore: Exit Function
    Else
        If (Ricevi("Ciao", Valore)) Then Ciclo = Valore: Exit Function
        If (Trasmetti("Salve", Valore)) Then Ciclo = Valore: Exit Function
        If (Ricevi("bella giornata", Valore)) Then Ciclo = Valore: Exit
Function
        If (Trasmetti("qui piove", Valore)) Then Ciclo = Valore: Exit
Function
    End If
End Function
Function Trasmetti(Testo As String, Valo As Integer) As Integer
    W1(Indice).SendData Testo & vbCrLf
    Text1 = Text1 & Testo & vbCrLf
    If W1(Indice).State <> 7 Then Valo = 2
End Function
Function Ricevi(Testo As String, Valo As Integer) As Integer
    Dim Tempo As Long, Risposta As String
    Risposta = ""
    Tempo = Timer
    Do While Risposta = ""
        DoEvents
        W1(Indice).GetData Risposta, vbString
        If Timer > Tempo + TimeOut Then Valo = 1: Ricevi = 1: Exit Function
        If W1(Indice).State <> 7 Then Valo = 2: Ricevi = 2: Exit Function
    Loop
    Text1 = Text1 & Risposta
    If Risposta <> Testo & vbCrLf Then Valo = 3: Ricevi = 3
End Function
Sub Partenza()
    Select Case Ciclo
        Case 0
            Text1 = Text1 & "Terminato" & vbCrLf
        Case 1
            MsgBox "Timeout"
        Case 2
            MsgBox "Errore di Connessione"
        Case Else
            MsgBox "Risposta Errata"
    End Select
End Sub
beppe
-----------------------------------------------------------
Visita il sito del WWF AltoFerrarese
http://www.comune.cento.fe.it/wwfaf
-----------------------------------------------------------