POP3: RETR braucht ewig

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Kiffi
Beiträge: 10725
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

POP3: RETR braucht ewig

Beitrag von Kiffi »

Hallo,

ich versuche mich gerade an einem POP3-Client. Hierzu verwende ich die
Routinen von Tibor aus dem alten Forum.

http://forums.purebasic.com/german/arch ... php?t=4403

Die Prozeduren, um die es geht, habe ich unten noch mal drangehängt.

Mein spezielles Problem: Ich frage mit GetMail() einen Account mit nur
einer eMail ab. Zwischen While-Wend wird die Variable string$ mit den
Rückgabewerten befüllt. string$ enthält bereits nach ca. 0.5 Sekunden den
gewünschen eMail-Inhalt. Dann allerdings dauert es noch 15 Sekunden(!),
bis die Prozedur zurückkommt. Was geschieht in dieser Zeit? Aus dem
Code werde ich leider nicht ganz schlau.

Oder anders gefragt: Wie kann man den Code abändern, dass er möglichst
schnell abläuft?

Am Timeout zu schrauben sorgt nur übrigens nur dafür, dass ich die eMail
nicht mehr vollständig erhalte...

Code: Alles auswählen

Procedure WaitNetworkClientEvent(ConnectionID,TimeOut)
  Repeat
    Delay(1)
    Event = NetworkClientEvent(ConnectionID)
    TimeOut-1
  Until Event Or TimeOut <= 0
	ProcedureReturn Event
EndProcedure

Procedure.s ReceiveNetworkString(ConnectionID)
  Repeat
    buffer$ = Space(3000)
    Ergebnis = ReceiveNetworkData(ConnectionID, @buffer$, 3000)
    string$+RTrim(buffer$)
  Until Ergebnis < 3000
	ProcedureReturn string$
EndProcedure

Procedure.s GetMail(ConnectionID,Index)
  SendNetworkString(ConnectionID, "RETR "+Str(Index)+#CRLF$)
  While WaitNetworkClientEvent(ConnectionID,1000) = 2
    string$ + ReceiveNetworkString(ConnectionID)
  Wend
  If Left(string$,3) = "+OK"
    ProcedureReturn string$
  EndIf
EndProcedure

Danke im voraus & Grüße ... Kiffi
Benutzeravatar
stbi
Beiträge: 685
Registriert: 31.08.2004 15:39
Wohnort: Cleverly Hills

Beitrag von stbi »

der Code ist nicht so doll ... das mit dem Timeout ist überflüssig.

Du hattest vor dem Pureboard-Crash noch ein Code gepostet, der statt mit RETR mit TOP arbeitete und Dein Problem löste. Das mit den Puffern und so war ok, aber ansonsten war es auch nicht der Knüller.
1. berücksichtigt nur Mails bis 10000 Zeichen Länge
2. checkt er das +OK nicht ab

es gibt noch folgende Möglichkeit:
1. nach dem RETR x kommt vom Server eine Zeile "+OK xxx octets", diese Antwort würde ich auf +OK auswerten

2. Dann könntest Du xxx auswerten und einen passend grossen Buffer reservieren, dann musst Du es nicht auf mehrere Häppchen verteilt abholen.
PB 4.02 XP Pro SP2 "Der Code ist willig, aber der Prozessor ist schwach."

Es gibt keine Vista-Witze. Es ist alles wahr!
Antworten