# IRC Protokoll



## shiftycapone (23. Mai 2004)

Hallo!

Ich möchte mich mit dem IRC Protokoll auseinander setzen. Ziel von mir sind zum Beispiel einfache Kommunkation zwischen Client und Server. Jedoch habe ich keine Ahnung wo ich anfangen muss. Gegoogelt habe ich schon, aber wonach? IRC Protokoll etc, spuckt er mir zwar Dokumente aus, aber dort steht nicht wie ich so ein Protokoll ansprechen muss. Wäre dankbar wenn mir jemand auf die Sprünge helfen würde! Ach ja, das ganze soll erstmal nutr unter Konsole laufen. Ists gut, wenn man Ahnung von Socket Programmierung hat? (Hab ich nämlich)

Danke für Eure Hilfe


----------



## Tobias Grimm (23. Mai 2004)

Ja du kannst das komplett mit Sockets realisieren, ein gutes Dokument zum Thema IRC-Protokoll findest du hier:
http://www.cse.ohio-state.edu/cgi-bin/rfc/rfc1459.html

Wenn du dich durch das Dokument durchgearbeitet und Grundwissen in Socket-Programmierung hast sollte das kein Problem sein.


----------



## shiftycapone (23. Mai 2004)

Danke für Deine schnelle Antwort!
Vielleicht ne dumme Frage, aber in diesen RFC's stehen ja keine Funktionen drin, die man aufrufen muss, oder? Wie realisier ich denn einen solchen Aufruf an hand der Informationen dieses Dokuments?

Als Beispiel nehme ich an:

Ich möchte den WHOIS Befehl senden. Sende ich dann einfach den String "Whois"? Und werte dann die Antwort vom Server aus, oder wie hab ich das zu verstehen?


----------



## Tobias Grimm (23. Mai 2004)

Wenn du eine Client-Anwendung schreiben willst connectest du zuerst ganz normal mit einem Socket auf einen IRC-Server deiner Wahl.

Hier steht welche Informationen der Server direkt nach der Verbindung erwartet:
http://www.cse.ohio-state.edu/cgi-bin/rfc/rfc1459.html#sec-4.1.1

Ich fasse das mal schnell zusammen. Wenn der IRC-Server passwortgeschützt ist  musst du als erste Nachricht "PASS serverpasswort\n" senden.
Danach ist die Nick-Message dran, z.B. "NICK meinnick\n".
Darauf folgt die etwas komplexere User-Message:
"USER deinident 8 * :dein richtiger name\n"
Irgendwann danach schickt dir der Server eine Nachricht "PING 123456" (mit einer eindeutigen Identifikationsnummer) auf die du mit "PONG 123456" (gleiche Nummer wie beim Ping) antworten musst.
Dann schickt dir das Quakenet z.B. automatisch die Message of the day und du bist eigentlich schon connected. Besondere Funktionen in dem Sinne gibt es da keine, das wird alles über Nachrichten geregelt die zwischen deinem Programm und dem Server verschickt werden.

Das steht übrigens wie gesagt alles in dem Dokument, netterweise auch noch untereinander. Einfach mal durcharbeiten, ohne kommst du nicht weit fürchte ich.

EDIT: deinen Whois-Befehl verschickt man so: "WHOIS nick\n".
Dann sendet der Server die Informationen zurück.
Aber wenn du erstmal eine stehende Verbindung hinbekommst ist der Rest auch nicht mehr schwer.


----------



## shiftycapone (23. Mai 2004)

Super, habs verstanden!
Vielen Dank!

EDIT: Habs wohl doch ncith verstanden.. Irgendwie klappt das nicht. Ich poste mal den kritischen Codeteil: 
	
	
	



```
memcpy(&buf, "NICK Carsten20\n", sizeof(buf)); 
buf[strlen(buf)] = '\0';
printf("Nick Kommado senden >> %s\n", buf);
send(sck, buf, strlen(buf),0);

memcpy(&buf, "USER Carsten20 8 *:cdv\n", sizeof(buf));   
buf[strlen(buf)] = '\0';   
printf("User Kommando senden >> %s \n", buf);   
send(sck, buf, strlen(buf),0);     

result = recv(sck, buf, 256,0);   
buf[result] = '\0';   
printf("Server sends Ping >> %d\n", buf);     

printf("Ping back: ");   
gets(buf);   
buf[strlen(buf)] = '\0';   
send(sck, buf, strlen(buf), 0);      
result = recv(sck, buf, 256 ,0);   
buf[result] = '\0';   
printf("Server MOTD: %s\n", buf);
```
  Die Verbindung zum Server steht. Aber der Rest des Codes  wohl net...  Was mach ich falsch?


----------



## shiftycapone (23. Mai 2004)

Bitte nochmal helfen, thx....


----------



## Endurion (24. Mai 2004)

Mit dem IRC-Problem selbst kann ich dir nicht helfen, aber:

memcpy(&buf, "NICK Carsten20\n", sizeof(buf)); 

KREISCH Du kopierst hier nicht nur deinen String, sondern auch noch sizeof( buf ) - strlen( "NICK Carsten20\n" ) Bytes von irgendwo. Das kann böse in die Hose gehen!


----------



## Dudadida (24. Mai 2004)

Ersetze mal das memcpy durch strcpy. Dann musst du weder ne 0 ans Ende setzen, du brauchst keine Längenangabe (und schon gar nicht so was abenteuerliches wie sizeof(buf)) und du musst nur buf groß genug machen um den String zu fassen.
Ach ja noch was anderes: Von der Sache die Endurion schon festgestellt hat abgesehen; du kopierst nicht in den Buffer, also nicht an die Adresse AUF DIE die Variable zeigt, sondern du kopierst an die Adresse DER VARIABLE die auf den Buffer zeigt. Soll heißen du löst damit zwangsläufig einen Zugriffsfehler aus (das geht eigentlich totsicher in die Hose). Es müsste eher irgendwie so aussehen:


```
char buf[256];

strcpy(buf, "NICK Carsten20\n"); 
printf("Nick Kommado senden >> %s\n", buf);
send(sck, buf, strlen(buf),0);
```


----------

