Newsgroup: it.comp.lang.visual-basic
Titolo: metodo GetData sul controllo Winsock (VB6)

Ho notato un malfunzionamento (?) del controllo winsock:
ho scritto un mini-programmino che mi dovrebbe fare il check di una casella
di posta con il POP3 (in pratica una piccola sessione di telnet). Quando
chiedo (sempre via winsock) il TOP di un
messaggio, all'arrivo della risposta (che fornisce l'header del messaggio
più le prime x righe dello stesso) che scatena l'evento DataArrival, il
metodo GetData (o anche il PeekData) legge SOLO il primo pacchetto TCP, con
la conseguenza che se il messaggio è mediocremente lungo, non riesco a
leggere nulla (se non le prime righe. Di solito 1380 bytes).
Mi aspettavo una gestione della stream di dati di più alto livello da parte
del winsock, cioè mi aspettavo di trovarmi nella mia variabile l'intero
contenuto del messaggio e non solo il primo pacchetto.
In ogni caso, anche facendo seguire un'altra GetData non si ottiene nulla.
note:
non faccio il retrive del messaggio perché non mi serve (non voglio leggere
il messaggio ma solo il mittente e l'oggetto) e comunque non cambierebbe
nulla.
Qualcuno sa darmi una dritta ?
grazie comunque
Stefano

 chiedo (sempre via winsock) il TOP di un
[SUPERCUT....]
Posta il codice che c'e' qualcosa che non va,
io ne ho fatte a pacchi di applicazioni sul pop3
e funziano a meraviglia
ciao
Lorenzo

"Lorenzo" <lcer...@NoSpam--dnsitalia.com> wrote in message
news:_MM9a.1614$Fc.4...@tornado.fastwebnet.it...
hai usato correttamente la sintassi del comando TOP?
n= Numero di linee del messaggio da recuperare
controlla plz :)
Fonte 
ftp://ftp.isi.edu/in-notes/rfc1939.txt
 POP3 Protocol
 TOP msg n
         Arguments:
             a message-number (required) which may NOT refer to to a
             message marked as deleted, and a non-negative number
             of lines (required)
         Restrictions:
             may only be given in the TRANSACTION state
         Discussion:
             If the POP3 server issues a positive response, then the
             response given is multi-line.  After the initial +OK, the
             POP3 server sends the headers of the message, the blank
             line separating the headers from the body, and then the
             number of lines of the indicated message's body, being
             careful to byte-stuff the termination character (as with
             all multi-line responses).

" & Chr(13) & Chr(10) Then
    W2.SendData "data" & Chr(13) & Chr(10)
End If
If Left(stri, 36) = "354 Send data.  End with CRLF.CRLF" & Chr(13) & Chr(10)
Then
    If mDaSped = 11 Then
        mDaSped = 0
            For i = 11 To 1 Step -1
            daSpedire(i, 1) = ""
            daSpedire(i, 2) = ""
        Next i
        Exit Sub
    End If
    If daSpedire(mDaSped + 1, 1) <> "" Then
        W2.SendData "Subject: " & daSpedire(mDaSped, 1) & Chr(13) & Chr(10)
& Chr(13) & Chr(10) & daSpedire(mDaSped, 2) & Chr(13) & Chr(10) & "." &
Chr(13) & Chr(10)
        mDaSped = mDaSped + 1
    Else
        mDaSpedt = mDaSped
        mDaSped = 0
        W2.SendData "Subject: " & daSpedire(mDaSpedt, 1) & Chr(13) & Chr(10)
& Chr(13) & Chr(10) & daSpedire(mDaSpedt, 2) & Chr(13) & Chr(10) & "." &
Chr(13) & Chr(10)
        For i = 11 To 1 Step -1
            daSpedire(i, 1) = ""
            daSpedire(i, 2) = ""
        Next i
    End If
End If
End Sub
Private Sub W1_DataArrival(ByVal bytesTotal As Long)
Dim stri2, nm As Long, uidmess As String
Dim aaa As Long, a As Long, b As Long, totUID As String
Dim nMess As Long
Dim mFrom As String, mSubj As String, i As Long
'Sleep 200
'W1.GetData stri2, vbString, bytesTotal
W1.PeekData stri2, vbString
If Left$(stri2, 6) = "+OK" & Chr(13) & Chr(10) & "." Then W1.Close
If Left$(stri2, 7) = "+OK" & Chr(13) & Chr(10) & "1 " And Len(stri2) > 7
Then
    W1.GetData stri2
    Open "C:\dbUID.txt" For Input As #1
    Do While Not EOF(1)
        totUID = totUID & Input(1, #1)
    Loop
    Close #1
    a = 6
    Do Until Mid$(stri2, a, 1) = "."
        b = InStr(a, stri2, " ")
        nm = Val(Mid$(stri2, a, b - a))
        a = b + 1
        b = InStr(a, stri2, Chr(13))
        uidmess = Val(Mid$(stri2, a, b - a))
        a = b + 2
        If InStr(1, totUID, "," & uidmess & ",") = 0 Then ' trovato un nuovo
messaggio
            nNuovi = nNuovi + 1
'-------------
            W1.SendData "TOP " & Str(nm) & " 1" & Chr(13) & Chr(10)  '
richiedi il dettaglio del singolo messaggio.
            'W1.SendData "retr " & Str(nm) & Chr(13) & Chr(10)   ' richiedi
il singolo messaggio.
            Open "C:\dbUID.txt" For Append As #1
            Print #1, "," & uidmess & ","
            Close #1
'-------------
        End If
    Loop
    'Sleep 300
    If nNuovi > 10 Then nNuovi = 10
    If nNuovi = 0 Then
        If W1.State = 7 Then W1.Close
    End If
End If
If Left$(stri2, 5) = "+OK" & Chr(13) & Chr(10) And Len(stri2) > 99 And
Mid$(stri2, 6, 1) <> "1" Then '36
'If bytesTotal > 99 And Mid$(stri2, 6, 1) <> "1" Then
    aaa = InStr(1, stri2, "From: ") + 6
    mFrom = Mid(stri2, aaa, InStr(aaa, stri2, Chr(13)) - aaa)
    aaa = InStr(1, stri2, "Subject: ") + 9
    mSubj = Mid(stri2, aaa, InStr(aaa, stri2, Chr(13)) - aaa)
    If aaa = 9 Then
        W1.GetData stri2, vbString                         ' aaa = 9 quando
non trova il subject.
        'W1.PeekData stri2, vbString                      ' Questa parte mi
serviva solo per fare un po' di prove.
        aaa = InStr(1, stri2, "Subject: ") + 9
        mSubj = Mid(stri2, aaa, InStr(aaa, stri2, Chr(13)) - aaa)
    End If
    '-----------INVIA SMS---------
    'Debug.Print mFrom
    'Debug.Print mSubj
    daSpedire(nNuovi, 1) = mFrom
    daSpedire(nNuovi, 2) = mSubj
    '-----------------------------
    nNuovi = nNuovi - 1
    If nNuovi = 0 Then
        If W1.State = 7 Then W1.Close
        'Stop
        inviaSMS
    End If
End If
If Left$(Right$(stri2, 10), 8) = "messages" Then
    W1.GetData stri2
    Timer2.Enabled = False
    nMess = Val(Trim(Left$(Right$(stri2, 13), 3))) ' # di messaggi TOTALI.
    If nMess = 0 Then
        mIconIndex = 0
        If W1.State = 7 Then W1.Close
        '---------- cancella il file dbUID.txt --------
        Open "C:\dbUID.txt" For Output As #1
        Write #1, ",1,"
        Close #1
        '----------------------------------------------
    Else
        mIconIndex = 2
        W1.SendData "UIDL" & Chr(13) & Chr(10) ' richiedi la lista dei
messaggi con gli UID.
    End If
    txtToolTip = "Messaggi: " & nMess
    cmdUpdate
End If
End Sub

             W1.SendData "TOP " & Str(nm) & " 1" & Chr(13) & Chr(10)  '
modifica " 1" con  " 3"
come ti dicevo la sintassi del comando è TOP iDmessaggio Numerotighe
molto spesso l'header del MSG trabocca per le estensioni MIME
vedi se così và....
intanto continuo a verificare se c'è qualche problema nel codice
ciao
Lorenzo