Lupuz.de: Artikel-Portal / Magazin

Zurück   Postpla.net - die Forum Community > PC, Internet und Technik > Coder's Area

Alternative zu: "TcpClient.Client.Blocking"

Anzeigen:

Thema geschlossen
 
Themen-Optionen
cyanide
Alt 12.03.2006, 18:54   #1
Standard Alternative zu: "TcpClient.Client.Blocking"

Erstmal vorweg: Ich brauche keine Zensur für den Code. Ich code einen Bot, er soll "nur" funktionieren, auch wenn Quick'n'Dirty! Ich kann nicht soviel Zeit in das Ding investieren. Er soll nur eine Seite "aufrecht" erhalten.

Nun zum Problem:



Für die Musik meiner Mitchatter entschuldige ich mich schonmal recht herzlich.

Also wie man sieht, liegt die CPU-Usage des Bots bei 99%! Das rührt daher, dass ich eine "Endlos"schleife habe, die ewig prüft, ob Daten auf dem Socket bereitliegen die ausgelesen werden sollen.
Auch ein "TcpClient.Client.Blocking = true;" ändert da nichts dran.
Also wenn jemand eine Idee hätte wie ich das lösen kann - Immer her damit.

Ein weiteres Problem ist übrigens, dass der Bot auch unter Linux laufen muss. OK, das ist ansich schon ein Problem , aber ein weiteres ist, das Mono anscheinend eher zu net 1.1 als 2.0 kompatibel ist, denn die Property "Client" von "TcpClient" ist dort noch protected, das heisst ich kann gar nicht auf diese zugreifen(erst ab 2.0). Eine Klasse von TcpClient möchte ich nicht ableiten.

Also wenn jemand eine Alternative dazu hat, möge er sie bitte nennen.

Hier ist übrigens der Code:

Code:

using System; using System.Collections; using System.Text; using System.Net.Sockets; using System.IO; namespace iSM
{
classProgram
{
structEventUser
{
internalstring Nickname;
internalstring Username;
internalstring Hostname;
}
staticvoid Main(string[] args)
{
conststring BNICK = "iSM";
conststring BPASSWD = "pwd";
conststring BCHAN = "#night";
TcpClient tcpClient = newTcpClient();
string sMainBuf = "";
tcpClient.Client.Blocking = true;
tcpClient.Connect("irc.ham.de.euirc.net", 6667);
SendText(ref tcpClient, "USER fick dich ins :knie");
SendText(ref tcpClient, "NICK " + BNICK);
while (tcpClient.Connected) // HIER DIE ENDLOSSCHLEIFE
{
byte[] baBuffer = newbyte[512];
string sRawCmd, sPrefix, sCmd, sParams;
EventUser User;
if (tcpClient.GetStream().DataAvailable)
{
sMainBuf += ASCIIEncoding.Default.GetString(baBuffer, 0, tcpClient.GetStream().Read(baBuffer, 0, 512));
sMainBuf = sMainBuf.Replace("\r", "\n");
sMainBuf = sMainBuf.Replace("\n\n", "\n");
while (sMainBuf.IndexOf('\n') > -1)
{
sRawCmd = sMainBuf.Substring(0, sMainBuf.IndexOf('\n'));
sMainBuf = sMainBuf.Remove(0, sMainBuf.IndexOf('\n') + 1);
System.Console.WriteLine(sRawCmd);
if (sRawCmd.Length > 0)
{
User.Nickname = "";
if (sRawCmd[0] == ':')
{
sPrefix = sRawCmd.Substring(1, sRawCmd.IndexOf(' '));
sRawCmd = sRawCmd.Remove(0, sRawCmd.IndexOf(' ') + 1);
int iHostPrePos = sPrefix.IndexOf('@');
if (iHostPrePos > -1)
{
User.Hostname = sPrefix.Substring(iHostPrePos, sPrefix.Length - iHostPrePos);
sPrefix = sPrefix.Remove(iHostPrePos, sPrefix.Length - iHostPrePos);
}
int iUserPrePos = sPrefix.IndexOf('!');
if (iUserPrePos > -1)
{
User.Username = sPrefix.Substring(iUserPrePos, sPrefix.Length - iUserPrePos);
sPrefix = sPrefix.Remove(iUserPrePos, sPrefix.Length - iUserPrePos);
}
User.Nickname = sPrefix;
}
sCmd = sRawCmd.Substring(0, sRawCmd.IndexOf(' '));
sParams = sRawCmd.Remove(0, sRawCmd.IndexOf(' ') + 1);
ArrayList salParams = newArrayList();
while (sParams != "")
{
if (sParams[0] == ':')
{
salParams.Add(sParams.Substring(1, sParams.Length - 1));
sParams = "";
}
elseif (sParams.IndexOf(' ') > -1)
{
salParams.Add(sParams.Substring(0, sParams.IndexOf(' ')));
sParams = sParams.Remove(0, sParams.IndexOf(' ') + 1);
}
else
{
salParams.Add(sParams);
sParams = "";
}
}
switch (sCmd)
{
case"PING":
SendText(ref tcpClient, "PONG :" + salParams[0].ToString());
break;
case"KICK":
if (salParams[1].ToString() == BNICK)
{
SendText(ref tcpClient, "JOIN " + BCHAN);
}
break;
case"NOTICE":
if ((User.Nickname == "NickServ") && (salParams[1].ToString() == "please choose a different nick."))
{
SendText(ref tcpClient, "PRIVMSG NickServ :identify " + BPASSWD);
SendText(ref tcpClient, "JOIN " + BCHAN);
}
break;
case"474": // Chan is banned
SendText(ref tcpClient, "PRIVMSG ChanServ :unban " + BCHAN);
SendText(ref tcpClient, "JOIN " + BCHAN);
break;
}
}
}
}
}
}
staticvoid SendText(refTcpClient tcpClient, string Text)
{
if (tcpClient != null)
{
byte[] baBuffer = newbyte[512];
Text += "\r\n";
int iBufSize = ASCIIEncoding.Default.GetBytes(Text, 0, Text.Length, baBuffer, 0);
tcpClient.GetStream().Write(baBuffer, 0, iBufSize);
}
}
}
}
MfG
 
 
Nach oben
cyanide
Alt 13.03.2006, 15:03   #2
Standard

Ok, auf euch Pfeiffen ist kein Verlass.

Die(/Eine) Lösung lautet:

Code:
System.Threading.Thread.Sleep(2);
Bye.
 
 
Nach oben
gagget
Alt 13.03.2006, 17:29   #3
Standard

Das Pause machen wenn nix los is fehlt

Code:
while ( Connected ) // HIER DIE ENDLOSSCHLEIFE
{
    if ( DataAvailable )// WENN DATEN ANSTEHEN 
    { 
        while( DataAvailable )// SOLANG DATEN ANSTEHEN 
        {
            /*
            ... DATEN VERARBEITEN ...
            */
        
        }
        
    }else //! WENN KEINE DATEN ANSTEHEN !
        sleep( some time ); //! MA KURZ PAUSE MACHN !
}
Hoffe konnte dir noch ein wenig weiter helfen
 
 
Nach oben
cyanide
Alt 13.03.2006, 18:22   #4
Standard

Moin gagget,

jep, dass konntest Du. Besten Dank - Funktioniert einwandfrei.
 
 
Nach oben
Ähnliche Themen, die dich vielleicht interessieren
Thema Autor Forum Antworten Letzter Beitrag
Alternative zu Festplatte löschen Dana28 Betriebssysteme und Software 12 28.11.2007 12:57
Alternative zum Drink bzw. Kaffee kleiner_pruder Liebe, Sex und Zärtlichkeit 4 19.10.2006 22:43
Alternative zu mobile master Dana28 Betriebssysteme und Software 1 16.08.2006 20:34
Gibt es etwa doch eine Alternative zur Nichtwahl? Powermax Politik und Gesellschaft 2 29.12.2003 17:37
Alternative zu "Virtual Desk" schnuckiwutz Betriebssysteme und Software 0 23.07.2003 17:27
Anzeigen:
Thema geschlossen

Themen-Optionen



Alle Zeitangaben in WEZ +2. Es ist jetzt 04:33 Uhr.


Lupuz.de - wir können auch anders!
©1998 - 2008, Lupuz:Information-Network
Powered by vBulletin Version 3.7.1 (Deutsch), Jelsoft Enterprises Ltd.
Grüne Links?

SEO by vBSEO 3.1.0 ©2007, Crawlability, Inc.