Toon posts:

[VB.NET](TcpClient)Lees alleen 1e regel in van response host

Pagina: 1
Acties:

Verwijderd

Topicstarter
Zal eerst even beginnen met de stukjes relevante code:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
Private Function getData() As String
        Dim bData(t.ReceiveBufferSize) As Byte
        getData = ""
        Do
            'get the data 
            s.Read(bData, 0, bData.Length)
            getData += System.Text.Encoding.ASCII.GetString(bData)
            MsgBox(getData)
            'clear byte array for next pass 
            bData.Clear(bData, 0, bData.Length)
            'if there is more data repeat
            'wait for the dataavailble flag to get set 
            System.Threading.Thread.Sleep(100)
        Loop While s.DataAvailable
End Function

Private Function SendCmd(ByVal Cmd As String) As String
        Dim bCmd As Byte()
        'byte encode the command 
        bCmd = System.Text.Encoding.ASCII.GetBytes(Cmd + vbCrLf)
        MsgBox(Cmd)
        'send the data 
        s.Write(bCmd, 0, bCmd.Length)
        SendCmd = getData()
End Function


Public Function getMail(ByRef m As MailMessage) As Boolean
        Dim msg As String
        Dim hend As Integer
        'if you haven't already go the message size 
        'get it 
        If m.Size = -1 Then
            getSize(m)
        End If
        'make sure the buffer is big enough to hold the message. 
        'to be sure make it just a little bigger 
        t.ReceiveBufferSize = m.Size
        msg = SendCmd("retr " + m.ID.ToString + " 0")
        'check the command was accepted OK 
        If Left(msg, 3) = "+OK" Then
            'find the end of the header. 
            'this is denoted by the first empty line in the message 
            hend = msg.IndexOf(vbCrLf + vbCrLf)
            'set the header 
            setHeader(m, Left(msg, hend))
            'set the mail body 
            'this is everything after the header. 
            m.Body = msg.Substring(hend + 4)
            Return True
        Else
            Return False
        End If
End Function


Het is een gedeelte van de code uit een klasse om mailtjes van een POP server te halen.

Als ik de klasse in een .vb file in mijn asp.net webapplicatie zet dan werkt alles perfect.

Maar als ik de vb als class library project pak en compile tot een .dll en deze gebruik in mijn Windows Forms applicatie knal hij er uit op het einde bij de regel

Visual Basic:
1
setHeader(m, Left(msg, hend))

(regel 46)Hier bij heeft hend de waarde -1.

Hend heeft dus de posititie van waar de header van de mail ophoudt (1e lege regel). Maar als .dll vindt hij deze positie niet. Ik heb een gedebugged en de plaats van het probleem gevonden:

Als ik
Visual Basic:
1
msg = SendCmd("retr " + m.ID.ToString + " 0")
(regel 39)
uitvoer wordt het commando op de POP server uitgevoerd om de mail binnen te halen.
Als eerste response krijg ik:
+OK
Wat klopt, betekend gewoon dat commando dat ik stuur klopt. Hierna moet dus het mailtje komen maar GetData krijgt niks meer binnen (of doet het verkeerd). Mijn vraag is waarom gaat het daar fout? Nogmaals... met telnet naar popserver en exact dezelfde handelingen uitvoeren werkt wel. En de klasse als losse .vb file in asp.net app werkt ook, gaat dus alleen mis als de klasse apart als gecompileerde assembly/dll/class library in een windows form gebruikt wordt.

De code heb ik overigens van http://www.aspalliance.com/damianm/article1/3/
edit:

Belangrijk punt dat ik vergeten was. Het gaat alleen verkeerd bij het binnenhalen van het eerste emailtje. De klasse kan terug geven hoeveel mailtjes erop de server staan en dat getal gebruik ik in een FOR NEXT loop om ze 1 voor 1 op te halen. Het probleem is niet dat loopje met 0 begint oid. Hij begint bij gewoon bij 1

[ Voor 8% gewijzigd door Verwijderd op 12-02-2003 09:18 ]


Verwijderd

Ik zou een NetworkStream en een StreamReader/StreamWriter gebruiken...daar heb je standaard de methods "ReadLine", "ReadToEnd" inzitten. Dan hoef je dat System.Encoding-gedoe ook niet te gebruiken. Dus (ff in C#):

code:
1
2
3
4
System.Net.Sockets.NetworkStream objNetworkStream=objTcpClient.GetStream();

System.IO.StreamReader objStreamReader=new StreamReader(objNetworkStream);
System.IO.StreamReader objStreamWriter=new StreamReader(objNetworkStream);


....en dan gebruik je dus gewoon de methodes van StreamReader en StreamWriter voor alle IO. Lijkt mij de makkelijkste/snelste oplossing.