Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

irc-client will nicht...

19 views
Skip to first unread message

Steffen Wendzel

unread,
Feb 2, 2002, 10:58:34 AM2/2/02
to
Hi !

Ich bastell mir grade nen IRC-Clienten. Das Problem
ist: Ich bekomm auf meinen Request keinen Response.
Ich sende folgenden String:

sprintf(
"buffer_a, "user %s localhost localhost :myname\r\nnick %s\r\n",
argv[3], argv[4]);

sprintf(buffer, "%s", buffer_a);

send(sock, buffer, strlen(buffer)-1, 0); /* habs auch ohne
-1 probiert - aber eigentlich soll ja kein '\0' gesended
werden */

recv(sock, recv_buffer, sizeof(recv_buffer), 0);
printf("%s", recv_buffer);

Hat jemand ne Idee, warum es nicht klappt ? In Telnet mach
ich eigentlich genau das selbe, mal davon abgesehen das Telnet
ein wenig anders als mein Client arbeitet - jedenfalls klappt
es in Telnet.

Ich habs auch schon auf die -ein Byte senden- -> eins empfangen
-> nächstes Byte senden -> empfangen usw. probiert - hat aber
auch nicht gefuntzt.

MfG Steffen.
--
KDE ist die Grafische Oberfläche von Linux,
C++ ist besser als C,
640k sind genug für jeden,
die Menschen sind gut

Felix von Leitner

unread,
Feb 2, 2002, 11:03:29 AM2/2/02
to
Thus spake Steffen Wendzel (Steffenwend...@t-online.de):

> Ich bastell mir grade nen IRC-Clienten.

Warum lernst du nicht erst mal Programmieren?

> sprintf(
> "buffer_a, "user %s localhost localhost :myname\r\nnick %s\r\n",
> argv[3], argv[4]);

Syntax error.

> sprintf(buffer, "%s", buffer_a);

*kotz*

> send(sock, buffer, strlen(buffer)-1, 0); /* habs auch ohne
> -1 probiert - aber eigentlich soll ja kein '\0' gesended
> werden */

man strlen
außerdem: kein error checking.

> recv(sock, recv_buffer, sizeof(recv_buffer), 0);

ebenfalls kein error checking.

> Ich habs auch schon auf die -ein Byte senden- -> eins empfangen
> -> nächstes Byte senden -> empfangen usw. probiert - hat aber
> auch nicht gefuntzt.

Ich würde mich wundern, wenn bei dir schon jemals irgendwas "gefunzt"
hätte.

Ich nominiere diesen Poster für eine Merkbefreiung.

Steffen Wendzel

unread,
Feb 2, 2002, 11:19:09 AM2/2/02
to
On Sat, 02 Feb 2002 16:03:29 GMT
Felix von Leitner <usenet-...@fefe.de> wrote:

> Thus spake Steffen Wendzel (Steffenwend...@t-online.de):
> > Ich bastell mir grade nen IRC-Clienten.
>
> Warum lernst du nicht erst mal Programmieren?

1. Ich habs ohne Syntax Error und mit Prüfungen der
Rückgabewerte im Source und habs aber der übersichthalber
schnell ohne das Zeugs abgeschrieben. Bei sprintf ist
mit halt nen Fehlerunterlaufen - ich glaub kaum, das du
ständig Fehlerfrei Source schreibst...

Steffen Wendzel.

Hynek Schlawack

unread,
Feb 2, 2002, 12:57:49 PM2/2/02
to
* Steffen Wendzel <Steffenwend...@t-online.de>:

> Ich bastell mir grade nen IRC-Clienten. Das Problem
> ist: Ich bekomm auf meinen Request keinen Response.
> Ich sende folgenden String:
> sprintf(
> "buffer_a, "user %s localhost localhost :myname\r\nnick %s\r\n",
> argv[3], argv[4]);

Argh, das ist doch pervers. Nimm statt dessen:

strcpy(buffer_a, "user ");
strcat(buffer_a, argv[3]);
strcat(buffer_a, " localhost localhost :myname\r\nnick ");
strcat(buffer_a, argv[4]);
strcat(buffer_a, " \r\n");

sprintf ist ein ein Performance-Monster. Wenn Dir die
String-Funktionen der string.h nicht reichen, dann schau Dir die
libofat (http://www.fefe.de/libowfat/) an, die bietet nette Funktionen
dazu (fmt_*).

> sprintf(buffer, "%s", buffer_a);

Argh, perverser gehts nicht:

strcpy(buffer, buffer_a);

> send(sock, buffer, strlen(buffer)-1, 0); /* habs auch ohne
> -1 probiert - aber eigentlich soll ja kein '\0' gesended
> werden */

strlen() liefert die Länge des Strings ohne \0! Warum meinst Du musst
Du malloc(strlen(string)+1); machen? Ach Du machst es nicht? Wundert
mich fast nicht.

> recv(sock, recv_buffer, sizeof(recv_buffer), 0);
> printf("%s", recv_buffer);

Vorschlag: lern erstmal Programmieren, dann C-Programmieren (K&R sind
hilfreich), dann Socketprogrammierung und dann lies den rfc - dann
klappts auch mit dem irc-Client.

Andreas Krey

unread,
Feb 3, 2002, 11:12:38 AM2/3/02
to
Hynek Schlawack <hy...@cs.uni-potsdam.de> wrote:
>* Steffen Wendzel <Steffenwend...@t-online.de>:

>
>> sprintf(
>> "buffer_a, "user %s localhost localhost :myname\r\nnick %s\r\n",
>> argv[3], argv[4]);
>
>Argh, das ist doch pervers. Nimm statt dessen:
>
>strcpy(buffer_a, "user ");
>strcat(buffer_a, argv[3]);
>strcat(buffer_a, " localhost localhost :myname\r\nnick ");
>strcat(buffer_a, argv[4]);
>strcat(buffer_a, " \r\n");
>
>sprintf ist ein ein Performance-Monster.

Auch im Vergleich zum immer-wieder-am-String-langhangeln
von strcat?

>> sprintf(buffer, "%s", buffer_a);
>
>Argh, perverser gehts nicht:
>

Doch:

sprintf (buffer, buffer_a);

In Produktionskot gesichtet worden.

Andreas

--
@(g){g(g)}(@(g){@(v){v>0 ? g(g)(v-1)*v : 1}})(99);

Hynek Schlawack

unread,
Feb 3, 2002, 12:06:36 PM2/3/02
to
* Andreas Krey <a.k...@gmx.de>:

> >Argh, das ist doch pervers. Nimm statt dessen:
> >strcpy(buffer_a, "user ");
> >strcat(buffer_a, argv[3]);
> >strcat(buffer_a, " localhost localhost :myname\r\nnick ");
> >strcat(buffer_a, argv[4]);
> >strcat(buffer_a, " \r\n");
> >sprintf ist ein ein Performance-Monster.
> Auch im Vergleich zum immer-wieder-am-String-langhangeln
> von strcat?

Kommt auf die Menge an, der eine Aufruf wirds nicht reissen aber
sobald es mehr wird:

hynek@hys:~> cat test1.c
#include <string.h>

int
main(void)
{
char *buffer = alloca(512);

if(buffer) {
int i;

for(i=0; i<1000000; i++) {
strcpy(buffer, "user ");
strcat(buffer, "foo");
strcat(buffer, " localhost localhost :myname\r\nnick ");
strcat(buffer, "bar");
strcat(buffer, " \r\n");
}
}

return 0;
}

hynek@hys:~> cat test2.c
#include <string.h>

int
main(void)
{
char *buffer = alloca(512);

if(buffer) {
int i;

for(i=0;i<1000000;i++) {
sprintf(buffer, "user %s localhost localhost :myname\r\nnick %s\r\n",
"foo", "bar");
}
}

return 0;
}

hynek@hys:~> gcc test1.c -o test1
hynek@hys:~> gcc test2.c -o test2
hynek@hys:~> time test1

real 0m0.263s
user 0m0.260s
sys 0m0.010s
hynek@hys:~> time test2

real 0m1.139s
user 0m1.020s
sys 0m0.010s
hynek@hys:~>

Der Unterschied ist btw schon bei 1000 Iterationen messbar aber hier
war es besonders anschaulich. :)

Ich habe mal zeitkritische Sachen geschrieben und seit dem ist sprintf
für mich gestorben. Wenn Du anfängst noch Zahlen reinzuformatieren
wirds besonders schlimm. Diese Werte sind btw von einem
1.7GHz-Rechner, es soll Leute geben die haben was langsameres.

In diesem Fall wäre ein sprintf nicht besonders schmerzhaft aber man
sollte sich allgemein abgewöhnen die Finger davon zu lassen, es gibt
da mit der libowfat wesentlich bessere Alternativen.

> >> sprintf(buffer, "%s", buffer_a);
> >Argh, perverser gehts nicht:
> Doch:
> sprintf (buffer, buffer_a);
> In Produktionskot gesichtet worden.

Naja, es geht immer schlimmer. :/

Andreas Krey

unread,
Feb 4, 2002, 1:45:38 PM2/4/02
to
Hynek Schlawack <hy...@cs.uni-potsdam.de> wrote:
>* Andreas Krey <a.k...@gmx.de>:

>
>> Auch im Vergleich zum immer-wieder-am-String-langhangeln
>> von strcat?
>
>Kommt auf die Menge an, der eine Aufruf wirds nicht reissen aber
>sobald es mehr wird:
>
....

> strcpy(buffer, "user ");
> strcat(buffer, "foo");
> strcat(buffer, " localhost localhost :myname\r\nnick ");
> strcat(buffer, "bar");
> strcat(buffer, " \r\n");
...vs...

> sprintf(buffer, "user %s localhost localhost :myname\r\nnick %s\r\n",
> "foo", "bar");
....

>
>Der Unterschied ist btw schon bei 1000 Iterationen messbar aber hier
>war es besonders anschaulich. :)
>
Musste ich dann doch selbst versuchen. Bei einer Laenge von "foo"
und "bar" von jeweils etwa 155 Zeichen erreichen die beiden
Codeschnipsel Gleichstand. (YMMV.)

>Ich habe mal zeitkritische Sachen geschrieben und seit dem ist sprintf
>für mich gestorben. Wenn Du anfängst noch Zahlen reinzuformatieren
>wirds besonders schlimm. Diese Werte sind btw von einem
>1.7GHz-Rechner, es soll Leute geben die haben was langsameres.
>

Ich habe mit Entsetzen festgestellt, dass die ganze sprintf-Iteration
schneller ist als eine Endlosschleifeniteration (ala 18 FE) auf
meinem Z80.

>In diesem Fall wäre ein sprintf nicht besonders schmerzhaft aber man
>sollte sich allgemein abgewöhnen die Finger davon zu lassen, es gibt

^^^^^^^^^^ ^^^^^^ :-)

>da mit der libowfat wesentlich bessere Alternativen.

An Stellen dieser Art steht bei mir
while (*p) p++;
strcpy (p, "blub");
etc.

Hynek Schlawack

unread,
Feb 4, 2002, 2:22:46 PM2/4/02
to
* Andreas Krey <a.k...@gmx.de>:

> >Der Unterschied ist btw schon bei 1000 Iterationen messbar aber
> >hier war es besonders anschaulich. :)
> Musste ich dann doch selbst versuchen. Bei einer Laenge von "foo"
> und "bar" von jeweils etwa 155 Zeichen erreichen die beiden
> Codeschnipsel Gleichstand. (YMMV.)

YMMV?

> Ich habe mit Entsetzen festgestellt, dass die ganze
> sprintf-Iteration schneller ist als eine Endlosschleifeniteration
> (ala 18 FE) auf meinem Z80.

Naja, kein wirklicher Vergleich wie ich meine. :)

> >In diesem Fall wäre ein sprintf nicht besonders schmerzhaft aber man
> >sollte sich allgemein abgewöhnen die Finger davon zu lassen, es gibt
> ^^^^^^^^^^ ^^^^^^ :-)

Naja. %)

> >da mit der libowfat wesentlich bessere Alternativen.
> An Stellen dieser Art steht bei mir
> while (*p) p++;
> strcpy (p, "blub");
> etc.

Bei mir auch, aber erklär das jemanden, der mit sprintf Strings
kopiert. Da ist es besser ihm zunächst einmal beizubringen kein
sprintf zu benutzen, das wodurch er es ersetzt kann man in n+1 Jahren
noch optimieren.

Andreas Krey

unread,
Feb 5, 2002, 3:29:39 AM2/5/02
to
Hynek Schlawack <hy...@cs.uni-potsdam.de> wrote:
>* Andreas Krey <a.k...@gmx.de>:
>
...
>YMMV?
>
de.newusers.questions? "Your Mileage may vary." Je nach Cache,
Hauptspeicheranbingung, Position des Codes etc. pp. sieht das anders aus.

>Bei mir auch, aber erklär das jemanden, der mit sprintf Strings
>kopiert. Da ist es besser ihm zunächst einmal beizubringen kein
>sprintf zu benutzen, das wodurch er es ersetzt kann man in n+1 Jahren
>noch optimieren.

P: "Mein Code semmelt ab."

Ich gucke in Programm und sehe

struct foo *p;
p->wawa = 5;

Ich: "Der Pointer ist nicht initialisiert"

P: "Aber er ist doch da!"

Ich: <sprachlos>

Ich habe immer noch keine Ahnung, wie man das begreiflich machen kann,
wenn der erste Satz nicht funktioniert.

Andreas Ferber

unread,
Feb 5, 2002, 3:59:40 AM2/5/02
to
* Andreas Krey <a.k...@gmx.de> schrieb:

>
> Ich: "Der Pointer ist nicht initialisiert"
> P: "Aber er ist doch da!"
> Ich: <sprachlos>
> Ich habe immer noch keine Ahnung, wie man das begreiflich machen kann,
> wenn der erste Satz nicht funktioniert.

"Die 5 Tonnen Beton wurden gerade in dein Wohnzimmer gekippt, statt in
die Baugrube drei Strassen weiter"

Andreas
--
Andreas Ferber - dev/consulting GmbH - Bielefeld, FRG
---------------------------------------------------------
+49 521 1365800 - a...@devcon.net - www.devcon.net

Hynek Schlawack

unread,
Feb 5, 2002, 7:59:41 AM2/5/02
to
* Andreas Krey <a.k...@gmx.de>:

> >YMMV?
> de.newusers.questions?

Wegen einem vergessen Acronym?

> "Your Mileage may vary." Je nach Cache, Hauptspeicheranbingung,
> Position des Codes etc. pp. sieht das anders aus.

However. Ich habe sprintf mal auf einem ausgelasteten und nicht ganz
so schnellen System gesehen und seitdem fasse ich es nicht mehr an -
ich versuche dem Anspruch zu folgen, dass meine Programme klein und
schnell sind, und zwar möglichst überall schnell.

> >Bei mir auch, aber erklär das jemanden, der mit sprintf Strings
> >kopiert. Da ist es besser ihm zunächst einmal beizubringen kein
> >sprintf zu benutzen, das wodurch er es ersetzt kann man in n+1 Jahren
> >noch optimieren.
> P: "Mein Code semmelt ab."
> Ich gucke in Programm und sehe
> struct foo *p;
> p->wawa = 5;
> Ich: "Der Pointer ist nicht initialisiert"
> P: "Aber er ist doch da!"
> Ich: <sprachlos>
> Ich habe immer noch keine Ahnung, wie man das begreiflich machen kann,
> wenn der erste Satz nicht funktioniert.

Das war aber kein Gegenargument. :) However, imho EOT, es wurde
bereits alles gesagt.

Felix Deutsch

unread,
Feb 5, 2002, 4:38:58 PM2/5/02
to
Andreas Krey wrote:

>P: "Mein Code semmelt ab."
>
>Ich gucke in Programm und sehe
>
> struct foo *p;
> p->wawa = 5;
>
>Ich: "Der Pointer ist nicht initialisiert"
>
>P: "Aber er ist doch da!"
>
>Ich: <sprachlos>

>Ich habe immer noch keine Ahnung, wie man das begreiflich machen kann,
>wenn der erste Satz nicht funktioniert.

struct foo mupfel;
p = &mupfel;

an geeigneter Stelle einfügen lassen. Geht leider nur bei "Urmel"
Connaisseurs.

HTH, Felix

0 new messages