Newsgroup: it.comp.lang.visual-basic
Titolo: DataArrival di Winsock

Si tratta di una ricezione di e-mail con Winsock... penserete, ma allora 
hai deciso di farti male!! .....
A volte, questa che segue da errore relativo al numero di file... non lo 
trova libero e dice che il numero non è valido... forse perché non lo 
chiude dopo il primo passaggio di byte (infatti la prima e-mail arriva, 
non le altre:intercettazione dell'errore) a causa di quell' IF che 
verifica la fine del file. Ecco la domanda è c'è un modo certo per 
individuare la fine del file e darla in pasto a quell' IF
 
Private Sub tcpClient_DataArrival(ByVal bytesTotal As Long)
tcpClient.GetData strdata, vbString
Select Case tcpClient.Tag
   Case "RETR"
       Put #1, , strdata
       IF InStr(strdata, vbLf + "." + vbCrLf) Then
          Close 1
           received = True
       End If
   Case Else
       sckError = (Left$(strdata, 3) = "-ER")
       received = True
End Select
End Sub
-- 
Gulp®

 End Sub
 
A parte che se lo tratti così, come minimo dovresti
mettere un close anche nel case else dopo il received,
e prevedere un timeout sulla ricezione... e non
capisco (e forse è meglio così :-) ) cosa c'entri
il .tag del TCPclient (una variabile apposta, no, eh ?),
ma sul Sito Comune c'è un esempio apposta: cerca Pop 3.
Per quel che ricordo era solo una bozza, ma funzionava.
 
Bye, G.

        Put #1
 
E' da fine anni '90 che non vedo una cosa del genere.
 
Il puntatore al file viene teoricamente liberato al Close, ma in realtà 
può restare 'appeso' per un po', anche qualora tutto andasse bene (se 
poi c'è un errore, è logico che resti in uso).
 
Per questo, dal secolo scorso si usa FreeFile()
 
Alberto
 
 

 Alberto
 
 
E visto che scritta così sembro in ritardo di un secolo (...bastava 
anche un ritardo minore!) e hai perfettamente ragione vado a provvedere 
e aggiungo anche un Close NumFile in Case Else come suggerito da Paperino:
 
Private sub EmailDownload()
....connessione al server
For m = 1 To Msg
       .Tag = "RETR"
       NumFile = FreeFile
       Open App.Path & "\Email\Temp\eMail-" & m & ".txt" For Binary 
Access Write As #NumFile
       sendMsg "RETR " & m
       txtMsgN = "E-mail scaricate: " & m & " di " & Msg
       sendMsg "DELE " & m '<---  cancellazione sul server
Next m
....
 
Private Sub tcpClient_DataArrival(ByVal bytesTotal As Long)
tcpClient.GetData strdata$
Select Case tcpClient.Tag
   Case "RETR"
       Put #NumFile, , strdata$    'il file è stato aperto dentro alla 
sub EmailDownload
       If InStr(strdata$, vbLf + "." + vbCrLf) Then
          Close NumFile
           received = True
       End If
   Case Else
       sckError = (Left$(strdata$, 3) = "-ER")
       received = True
	Close NumFile	
End Select
End Sub
 
Ma anche così bellamente si ripresenta errore 52: Nome o numero di file 
non valido.
 
-- 
Gulp®

Il 10/02/12 9.20, Albe V° ha scritto:
 
Risolto:
era quel sendMsg "DELE " & m dato mentre .tag="RETR" che non andava bene.
....
.Tag = ""
       sendMsg "DELE " & m '<---  cancellazione sul server
Next m
End If
sendMsg "QUIT"
....
 
Inoltre per ottenere l'effettiva cancellazione prima del .Close del 
Winsock bisognava porre un bel "QUIT"
 
ah, dimenticavo Case Else senza Close NumFile permette al tutto di 
funzionare decisamente meglio. ;)
 
-- 
Gulp®