[C# / NNTP] Pakt het einde van de newslist niet.

Pagina: 1
Acties:

  • Gurbe de n00b
  • Registratie: Juni 2003
  • Laatst online: 08-02-2024
Hallo Tweakers.

Ik heb een script gemaakt om de nieuwsgroepen van de een NNTP server te plukken.

Alleen waneer hij de nieuwsgroepen ophaalt stopt hij niet goed meer.
Hij loopt dan vast in de Response method.

Ik heb al geprobeerd.
Op basis van de lengte van de stream te stoppen.
Maar ik kan de lengte van die stream niet goed vaststellen omdat deze steeds varieert.

en ik heb via de methode DataAvaible geprobeerd.
Dit gaf helaas ook geen uitkomst...

Normaal gesproken geeft de NNTP server een .\r\n mee op het laatst.
Alleen nu niet.

Kan iemand mij misschien een beetje in de goede richting sturen voor een oplossing hiervoor ?

Alvast bedankt :)

Mijn script:
C#:
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
using System;
using System.Collections;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        private static System.Net.Sockets.TcpClient Client = new System.Net.Sockets.TcpClient();
        public static int count = 0;

        static void Main(string[] args)
        {
            Client.Connect("news.arnhem.chello.nl", 119);
            Console.Write(Response());

            ArrayList Arry = new ArrayList();

            Arry = GetNewsgroups();

            Write("QUIT\r\n");

            Console.WriteLine(Response());

            Console.ReadLine();
        }

        public static ArrayList GetNewsgroups()
        {
            string message;
            string response;

            ArrayList retval = new ArrayList();
            message = "LIST\r\n";
            Write(message);
            response = Response();

            while (true)
            {
                response = Response();
                if (response == ".\r\n" ||
                    response == ".\n")
                {
                    return retval;
                }
                else
                {
                    char[] seps = { ' ' };
                    string[] values = response.Split(seps);
                    retval.Add(values[0]);
                    continue;
                }
            }
        }

        private static void Write(string message)
        {
            System.Text.ASCIIEncoding en = new System.Text.ASCIIEncoding();

            byte[] WriteBuffer = new byte[1024];
            WriteBuffer = en.GetBytes(message);

            System.Net.Sockets.NetworkStream stream = Client.GetStream();
            stream.Write(WriteBuffer, 0, WriteBuffer.Length);
        }

        private static string Response()
        {
            string retStr = string.Empty;

            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
            byte[] serverbuff = new System.Byte[1024];

            System.Net.Sockets.NetworkStream stream = Client.GetStream();
            
            Program.count = stream.Read(serverbuff, 0, 1024);

            retStr = enc.GetString(serverbuff, 0, count);

            return retStr;
        }

        private static bool DataAvaible()
        {
            System.Net.Sockets.NetworkStream stream = Client.GetStream();

            return stream.DataAvailable;
        }
    }
}

Portfolio


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:26
Mja, je zit daar in een oneindige lus, waar je een beetje op een onorthodoxe manier uitspringt.
Verder is die continue ook helemaal niet nodig binnen die lus.

Ik denk dat je het beter zo zou doen: (ongeveer);
code:
1
2
3
4
5
6
7
8
9
StreamReader sr = new StreamReader(stream);
bool isRunning = true;
while( isRunning )
{
     while( sr.IsDataAvailable )
     {
          string response = sr.ReadLine();
     }
}

dan moet je er natuurlijk ook wel voor zorgen dat die isRunning op false gezet wordt, indien nodig. Eigenlijk heb je die 'isRunning' enkel nodig als je die code in een aparte thread uitvoert, en je constant wilt gaan checken of er iets te lezen valt.
Om je ff een idee te geven.

[ Voor 21% gewijzigd door whoami op 11-08-2006 20:58 ]

https://fgheysels.github.io/


  • Gurbe de n00b
  • Registratie: Juni 2003
  • Laatst online: 08-02-2024
Hmm,

Ik begrijp wat je bedoelt.

Alleen ik snap niet echt wat je met die IsRunning lus wilt bereiken.

Hmm,

Edit
Is er geen methode om die streambuffer in 1 keer leeg te schrijven ?

[ Voor 31% gewijzigd door Gurbe de n00b op 11-08-2006 21:51 ]

Portfolio