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

Popular posts from this blog

resizing Telegram inline keyboard -

command line - How can a Python program background itself? -

php - "cURL error 28: Resolving timed out" on Wordpress on Azure App Service on Linux -