Dit is de volledige code die ik gebruik,
De code moet als volgt worden aangeroepen:
- Connect (met je newsserver)
- Authenticate (username en pass) (indien nodig voor je nieuwsserver)
- Switch group zorgt ervoor dat de nieuwsserver weet in welke groep je uithangt, (out parameters meegeven aan GetArticles)
- GetArticles haalt de artikelen daadwerkelijk op en retourneert ze als ID,message.
De reden dat je de outparameters weer aan GetArticles moet meegeven is dat ik van plan ben de articles door meerdere threads te laten downloaden (dus ieder een portie van 100 articles geven).
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
| class NNTPSocket : TcpClient
{
private ASCIIEncoding en = new ASCIIEncoding();
private NetworkStream stream;
private byte[] buff = new byte[100000];
~NNTPSocket()
{
Disconnect();
}
public bool Connect(string server)
{
NoDelay = true;
Connect(server, 119);
stream = GetStream();
string response = Response();
if ((response.Substring(0, 3) == "200") || (response.Substring(0, 3) == "201"))
{
return true;
}
return false;
}
public bool Authenticate(string username, string password)
{
Write("AUTHINFO USER " + username + "\r\n");
string response = Response();
if (response.Substring(0, 3) != "381")
{
return false;
}
Write("AUTHINFO PASS " + password + "\r\n");
response = Response();
if (response.Substring(0, 3) != "281")
{
return false;
}
return true;
}
public void Disconnect()
{
Write("QUIT\r\n");
}
public bool SwitchGroup(string newsgroup, out long start, out long end)
{
Write("GROUP " + newsgroup + "\r\n");
string response = Response();
if (response.Substring(0, 3) != "211")
{
start = 0;
end = 0;
return false;
}
string[] values = response.Split(' ');
start = Int32.Parse(values[2]);
end = Int32.Parse(values[3]);
return true;
}
public Dictionary<long, string> GetArticles(long start, long end)
{
Dictionary<long, string> retval = new Dictionary<long, string>();
for (long i = start; i < end; i++)
{
Write("ARTICLE " + Convert.ToString(i) + "\r\n");
string article = "";
bool articleOK = false;
do
{
string response = Response();
if (response.StartsWith("220"))
{
articleOK = true;
}
article += response;
if (response.EndsWith(".\r\n") || response.EndsWith(".\n"))
{
break;
}
}
while (articleOK);
if (articleOK)
{
retval.Add(i, article);
}
}
return retval;
}
private void Write(string message)
{
byte[] writeBuffer = en.GetBytes(message);
stream.Write(writeBuffer, 0, writeBuffer.Length);
}
private string Response()
{
string tempStr = "";
while ((tempStr.Length==0) || (tempStr[tempStr.Length - 1] != '\n'))
{
int bytes = stream.Read(buff, 0, buff.Length);
tempStr += en.GetString(buff, 0, bytes);
}
return tempStr;
}
} |
Newsleecher haalt 800kb/s / 1mb/s makkelijk, volgens mij is dit een Delphi applicatie.
Ik houd de verbinding open gedurende de tijd dat ik articles download (en dus dat ik mijn downloadsnelheid meet) Als ik 1000 articles gedownload heb sluit ik af (wat ik ook terugzie in het netwerkverbruik)