Newsgroup: it.comp.lang.visual-basic
Titolo: errore run time con winsock!!

Ciao  a tutto il NG,
ho creato un server ed un client con VB, utilizzando il winsock
component.
client e server si devono semplicemente passare una stringa.
La connessione va a buon fine. nel momento in cui viene invocato il
metoto Winsock.SendData testo mi viene rilevato un errore di questo
tipo:
errore di run time '40006':protocollo o stato della connessione errato
per la transazione richiesta o per la richiesta.
di seguito il codice
server
-------
Private Sub Form_Load()
' Imposta su un intero la proprietà LocalPort.
' Richiama quindi il metodo Listen.
tcpServer.LocalPort = 1001
tcpServer.Listen
End Sub
Private Sub tcpServer_ConnectionRequest(ByVal requestID As Long)
' Verifica se il valore della proprietà State
' è sckClosed. In caso contrario, chiude la
' connessione prima di accettare quella nuova.
If tcpServer.State <> sckClosed Then
tcpServer.Close
End If
' Accetta la richiesta con il parametro
' requestID.
tcpServer.Accept requestID
End Sub
Private Sub tcpServer_DataArrival(ByVal bytesTotal As Long)
' Dichiara una variabile per i dati in ingresso.
' Richiama il metodo GetData e assegna i dati
' alla proprietà Text del controllo casella di
' testo txtOutput.
Dim strData As String
MsgBox "sono in data arrival"
tcpServer.GetData strData
txtOutput.Text = strData
End Sub
client
------
Private Sub Command1_Click()
Dim testo As String
testo = txtSend.Text
tcpClient.Connect
tcpClient.SendData testo
End Sub
Private Sub Form_Load()
' Il nome del controllo WinSock è tcpClient.
' Nota: per specificare un host remoto, è possibile
' utilizzare l'indirizzo IP (es: "121.111.1.1")
' oppure il nome del computer, come qui indicato.
tcpClient.RemoteHost = "pcs0101.PCS0101"
tcpClient.RemotePort = 1001
End Sub
Private Sub cmdConnect_Click()
' Richiama il metodo Connect per stabilire una
' connessione.
End Sub
Private Sub txtSendData_Change()
End Sub
Private Sub tcpClient_DataArrival(ByVal bytesTotal As Long)
Dim strData As String
tcpClient.GetData strData
txtOutput.Text = strData
End Sub
grazie a chiunque legga o posti
Alessandro

 End Sub
Credo che l'errore sia qui, anche io quando usavo i winsock incappavo sempre
in questa cosa. CREDO che risolveresti il problema se usassi il
tcpclient.senddata testo nell'evento "connect" del client. Credo che
l'errore sia dovuto al fatto che, nel modo in cui lo hai scritto, il sock
tenti di spedire dati ancor prima della connessione. Sottolineo, CREDO! :)
Ciao.
--
Starla. SP.

 ha scritto

No, hai perfettamente ragione. La connessione richiede tempo, e dato che avviene in maniera
asincrona ti devi fermare ed aspettare che sia avvenuta (consultando lo stato della connessione con
la proprietà State).
Non ricordo se ci siano degli eventi che vengono lanciati dal winsock a connessione avvenuta.
Altrimenti ci metti un bel ciclo
    while winsock.state <> sckConnected: doevents: wend
prima di mandare alcunche' con senddata.
Sto andando a memoria, quindi dovrai gestire per conto tuo il caso di errori (evento error del
winsock)

A già ecco, bravo Jabba. Prima lanciavo il senddata nell'evento connect del
client, poi ci avevo piazzato un bel doevents, con la gestione degli errori
nello stesso ciclo.
Oh, è la prima volta che qualcuno qui dentro mi da ragione, lasciatemi il
mio momento di gloria! :). Che lamer.
Starla.

>>>> "JTH" == Jabba The Hutt <Jabba....@Alderaan.SW> writes:
JTH> | Credo che  l'errore sia  qui, anche io  quando usavo  i winsock
JTH> | incappavo  sempre in  questa  cosa.
JTH> No, hai  perfettamente ragione. La connessione  richiede tempo, e
JTH> dato che avviene in maniera asincrona
E' la cosa che mi piace di meno del controllo Winsock, le chiamate non
bloccanti.
E la  connessione puo` richiedere anche  un bel po' di  tempo dato che
richiede uno scambio di pacchetti  (cosi` come la chiusura). Su lan il
tempo e` breve,  ma non abbastanza breve da  essere insignificante per
i tempi di elaborazione del computer.
-- 
Gian  | main(){printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);}
Uberto|                        David Korn, 1987 ioccc best one liner 
Lauri |-------------------------------------------------------------------
(aka saint) >>Vedere X-Nospam nell'header - See X-Nospam field in Header<<