How to connect a client to an IRC server using sockets in C -
i coding irc client want connect irc.hackerzvoice.net. have read rfc1459 similar posts here on stackoverflow, still not can possibly wrong in code. still same "registration timeout" error after sending nick , user messages.
la socket 280 est ouverte en tcp/ip. connexion 212.83.153.145 sur le port 6667 68 octets ont ete recus texte recu : :irc.hackerzvoice.net notice auth :*** looking hostname... 16 octets envoyes au serveur texte envoye : nick parallel .30 octets envoyes au serveur texte envoye : user parallel * * :parallel .99 octets ont ete recus texte recu : :irc.hackerzvoice.net notice auth :*** found hostname (catv-89-132-88-100.catv.broadband.hu) 92 octets ont ete recus texte recu : error :closing link: (unknown@catv-89-132-88-100.catv.broadband.hu) [registration timeout] d.hu) 0 octets ont ete recus texte recu : error :closing link: (unknown@catv-89-132-88-100.catv.broadband.hu) [registration timeout] d.hu)
here code:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "root_me_1.h" int main() { // si la plateforme est windows #if defined (win32) wsadata wsadata; wsastartup(makeword(2,2), &wsadata); // sert à initialiser la bibliothèque winsock #endif // socket et interface de connexion socket sock; sockaddr_in sin; // structure char buffer[taille_max] = ""; int noctetsrecus = 0; int noctetsenvoyes = 0; int taillebuffer = 0; int boucle = 1; // on crée une socket utilisant protocole tcp/ip sock = socket(af_inet, sock_stream, 0); if(sock == invalid_socket) printf("erreur, socket non valide"); printf("la socket %d est ouverte en tcp/ip.\n", sock); // on configure l'interface de connexion sin.sin_addr.s_addr = inet_addr("212.83.153.145"); // adresse ip du serveur irc sin.sin_family = af_inet; sin.sin_port = htons(port); // sin_port et sin_addr doivent être en network byte order // htons() convertit un entier court depuis l'ordre des octets de l'hôte vers celuidu réseau (host network short) if(connect(sock, (sockaddr*)&sin, sizeof(sin)) != socket_error) // si le client réussit à se connecter au serveur printf("connexion %s sur le port %d\n", inet_ntoa(sin.sin_addr), htons(sin.sin_port)); else printf("erreur de connexion."); // on reçoit les données envoyées par le serveur noctetsrecus = recv(sock, buffer, taille_max, 0); if(noctetsrecus != socket_error) { printf("%d octets ont ete recus\n", noctetsrecus); printf("texte recu : %s", buffer); } else printf("les donnees n'ont pas ete recues"); // le client envoie des données au serveur sprintf(buffer, "nick parallel\r\n"); taillebuffer = strlen(buffer)+1; // taille de la chaine + '\0' noctetsenvoyes = send(sock, buffer, taillebuffer, 0); if(noctetsenvoyes != socket_error) { printf("%d octets envoyes au serveur\n", noctetsenvoyes); printf("texte envoye : %s", buffer); } else printf("erreur : donnees non envoyees au serveur"); // le client envoie des données au serveur sprintf(buffer, "user parallel * * :parallel\r\n"); taillebuffer = strlen(buffer)+1; // taille de la chaine + '\0' noctetsenvoyes = send(sock, buffer, taillebuffer, 0); if(noctetsenvoyes != socket_error) { printf("%d octets envoyes au serveur\n", noctetsenvoyes); printf("texte envoye : %s", buffer); } else printf("erreur : donnees non envoyees au serveur"); // on reçoit les données envoyées par le serveur noctetsrecus = recv(sock, buffer, taille_max, 0); if(noctetsrecus != socket_error) { printf("%d octets ont ete recus\n", noctetsrecus); printf("texte recu : %s", buffer); } else printf("les donnees n'ont pas ete recues"); // on ferme la connexion closesocket(sock); #if defined (win32) wsacleanup(); // libère les ressources allouées par la fonction wsastartup() #endif getchar(); return exit_success; }
would have idea of problem?
thank you.
this problem,
sprintf(buffer, "nick hoeplem\r\n"); taillebuffer = strlen(buffer)+1;
because strlen(buffer) + 1
1 byte off (the null
terminator '\0'
should not sent server , strlen()
returns length of string excluding null
terminator.) actual length of string. if server reads byte might expecting '\r\n'
flush buffer , process command, it's waiting forever after last "command".
it should be
taillebuffer = sprintf(buffer, "nick hoeplem\r\n");
and way perfect.
you might want check posix's dprintf()
and/or roll own dprintf()
avoid sprintf()
ing every time.
also, better have each command function it's parameters , call command_x(sock, parameters ...)
every possible command, way code more robust.
Comments
Post a Comment