All pastes #30306 Raw Edit

sepen

public c v1 · immutable
#30306 ·published 2005-11-22 15:06 UTC
rendered paste body
#include <stdio.h>#include <unistd.h>#include <string.h>#include <fcntl.h>#include <netdb.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#define MAX_DATA_SIZE 4096#define IRC_SERVER "mikeux.dyndns.org"#define IRC_CHANNEL "#mikeux"#define IRC_NICKNAME "boTc"#define IRC_PORT 6667int fd_socket;                                  // descriptor de fichero del socketstruct hostent *hostent;                        // estructura que recibira información sobre el nodo remotostruct sockaddr_in servidor;                    // informacion sobre la direccion del servidorchar buffer_from_server[MAX_DATA_SIZE];         // buffer de lectura de los datos que llegan del servidorchar buffer_to_server[MAX_DATA_SIZE];           // buffer de escritura de los datos que se envian al servidorint buffer_from_server_count;                   // contador del buffer de lecturaint tipo_de_peticion;                           // tipo:        0 - notice                                                //              1 - ping del servidor                                                //              2 - mensaje del canal                                                //              3 - peticion del canal al bot/*----------------------------- funciones ------------------------------------------*/int resuelve_dns() {        if ((hostent=gethostbyname(IRC_SERVER))==NULL) {                //printf("---x-x--- ERROR: resuelve_dns() - gethostbyname()\n");                return 0;        }        //printf("---x-x--- resuelve_dns(): %s - %s\n",hostent->h_name,inet_ntoa(*((struct in_addr *)hostent->h_addr)));        return 1;}int crea_socket() {        if ((fd_socket=socket(AF_INET, SOCK_STREAM, 0))==-1) {                //printf("---x-x--- ERROR: crea_socket() - socket()\n");                return 0;        }        //printf("---x-x--- crea_socket()\n");        return 1;}int cierra_socket() {        if ((close(fd_socket))==-1) {                //printf("---x-x--- ERROR: cierra_socket() - close()\n");                return 0;        }        //printf("---x-x--- cierra_socket()\n");        return 1;}int inicializa_sockaddr() {        servidor.sin_family = AF_INET;        servidor.sin_port = htons(IRC_PORT);        servidor.sin_addr = *((struct in_addr *)hostent->h_addr);        bzero(&(servidor.sin_zero), 8);        //printf("---x-x--- inicializa_sockaddr()\n");        return 1;}int conecta_con_servidor() {        if ((connect(fd_socket, (struct sockaddr *)&servidor, sizeof(struct sockaddr)))==-1) {                //printf("---x-x--- ERROR: conecta_con_servidor() - connect()\n");                return 0;        }        //printf("---x-x--- conecta_con_servidor()\n");        return 1;}int registra_en_servidor(){        strcpy(buffer_to_server,"NICK ");        strcat(buffer_to_server,IRC_NICKNAME);        strcat(buffer_to_server,"\r\n");        send(fd_socket,buffer_to_server,strlen(buffer_to_server),0);        strcpy(buffer_to_server,"USER ");        strcat(buffer_to_server,IRC_NICKNAME);        strcat(buffer_to_server," 0 0 :BOTC\r\n");        send(fd_socket,buffer_to_server,strlen(buffer_to_server),0);        sleep(1);        //printf("---x-x--- registra_en_servidor()\n");        return 1;}int recibe_del_servidor() {        if (((buffer_from_server_count=recv(fd_socket,buffer_from_server,MAX_DATA_SIZE,0)))==-1) {                //printf("---x-x--- ERROR recibe_del_servidor() - recv() \n");                return 0;        }        buffer_from_server[buffer_from_server_count]='\0';        //printf("---x-x--- recibe_del_servidor() \n\n%s\n", buffer_from_server);        return 1;}int unirse_a_canal() {        strcpy(buffer_to_server,"JOIN ");        strcat(buffer_to_server,IRC_CHANNEL);        strcat(buffer_to_server,"\r\n");        send(fd_socket,buffer_to_server,strlen(buffer_to_server),0);        //printf("---x-x--- unirse_a_canal()\n");        return 1;}int descifra_el_tipo_de_peticion() {        char tmp[100];        strcpy(tmp, "PING :");        if (strstr(buffer_from_server, tmp)!=NULL) tipo_de_peticion=1;        strcpy(tmp, "PRIVMSG ");        strcat(tmp, IRC_CHANNEL);        if (strstr(buffer_from_server, tmp)!=NULL) tipo_de_peticion=2;        strcat(tmp, " :");        strcat(tmp, IRC_NICKNAME);        strcat(tmp, ", ");        if (strstr(buffer_from_server, tmp)!=NULL) tipo_de_peticion=3;}char *leer_porcion(int porcion) {        int i=2;        char *porcion_leida;        porcion_leida=strtok(buffer_from_server, " ");        while (i<=porcion) {                porcion_leida=strtok(NULL, " ");                i++;        }        if (porcion_leida!=NULL) printf("---x-x--- leer_porcion(%d): %s\n", porcion, porcion_leida);        return porcion_leida;}int responder_a_ping() {        strcpy(buffer_to_server, "PONG :");        strcat(buffer_to_server, IRC_SERVER);        strcat(buffer_to_server,"\r\n");        send(fd_socket,buffer_to_server,strlen(buffer_to_server),0);        printf("---x-x--- responder_a_ping(): %s\n", buffer_to_server);        return 1;}int responder_a_mensaje_del_canal() {}int responder_a_peticion_del_canal() {        strcpy(buffer_to_server, "PRIVMSG ");        strcat(buffer_to_server, IRC_CHANNEL);        strcat(buffer_to_server, " :respuesta -> ");        strcat(buffer_to_server, leer_porcion(5));        strcat(buffer_to_server,"\r\n");        send(fd_socket,buffer_to_server,strlen(buffer_to_server),0);        printf("---x-x--- responder_a_peticion_del_canal(): %s\n", buffer_to_server);        return 1;}int responde_al_tipo_de_peticion() {        switch (tipo_de_peticion) {                case 1: printf("tipo 1: %s", buffer_from_server);                        responder_a_ping();                        break;                case 2: printf("tipo 2: %s", buffer_from_server);                        responder_a_mensaje_del_canal();                        break;                case 3: printf("tipo 3: %s", buffer_from_server);                        responder_a_peticion_del_canal();                        break;                default : printf("%s", buffer_from_server);        }}/*----------------------------- programa principal ---------------------------------*/int main() {        if ((resuelve_dns())==0) return -1;        if ((crea_socket())==0)  return -1;        if ((inicializa_sockaddr())==0)  return -1;        if ((conecta_con_servidor())==0)  return -1;        if ((registra_en_servidor())==0)  return -1;        if ((recibe_del_servidor())==0)  return -1;        if ((unirse_a_canal())==0) return -1;        if ((recibe_del_servidor())==0)  return -1;        while (1) {                if ((recibe_del_servidor())!=0) {                        descifra_el_tipo_de_peticion();                        responde_al_tipo_de_peticion();                }        }        if ((cerrar_socket())==0) return -1;}