Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - snake_linux

#21
He estado investigando un poco como comunicarse con un servidor IRC (solo lo básico, conectarse a un canal y mandar un mensaje), y junto con varios códigos que he estado leyendo en internet, he conseguido armar un código que en teoría se conecta al irc y envia un mensaje de prueba, el caso es que lo he ejecutado, no da ningún error, hasta dice en mi terminal que se ha conectado, pero no veo que mande el mensaje ni se conecte el usuario del bot, dejo el código completo aquí:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>  

int main(int argc, char *argv []) {
   
   int mysocket;
   struct sockaddr_in server;
   struct hostent *he;
   
   if ((he=gethostbyname(argv[1]))==NULL){      
     /* llamada a gethostbyname() */
     printf("gethostbyname() error\n");
     exit(-1);
  }
 
  if ((mysocket=socket(AF_INET, SOCK_STREAM, 0))==-1){  
     /* llamada a socket() */
     printf("socket() error\n");
     exit(-1);
  }
   
   server.sin_family = AF_INET;
  server.sin_port = htons(6667);
  /* htons() es necesaria nuevamente ;-o */
  server.sin_addr = *((struct in_addr *)he->h_addr);  
  /*he->h_addr pasa la información de ``*he'' a "h_addr" */
  bzero(&(server.sin_zero),8);
 
  if(connect(mysocket, (struct sockaddr *)&server,
     sizeof(struct sockaddr))==-1){
     /* llamada a connect() */
     printf("connect() error\n");
     exit(-1);
  }
  printf("conexion establecida\n");
   send(mysocket,"NICK Snake\r\n",strlen("NICK Snake\r\n"),0);
   send(mysocket,"USER Snake\r\n",strlen("USER Snake\r\n"),0);
   send(mysocket,"JOIN #amor\r\n",strlen("JOIN #amor\r\n"),0);
send(mysocket,"PRIVMSG #amor :Hello world!\r\n",strlen("PRIVMSG #amor :Hello world!\r\n"),0);
close(mysocket);
   
   
}


offtopic: He estado viendo como se usan los sockets en Python y no tiene comparación... en C me resulta muy dificil comprenderlo.
#22
Lo conseguiría, pero tendría que buscar mucha info de como funciona un servidor/cliente irc y me llevaría varios dias, pero yo creo que lo conseguiría, de todas formas creo que para ese tipo de cosas otros lenguajes van mejor, por que facilitan más la vida que C puro y duro.
#23
Programación C/C++ / Sobre mis conocimientos de C
3 Septiembre 2015, 12:29 PM
Hola a tod@s, como ya sabreis algunos, mi meta es saber varios lenguajes de programación, empecé con C, primero por que mucha gente dice que es la base y por que en general el lenguaje me gusta, es quisquilloso pero a la vez sencillo en cuanto a estructura.

El caso es que ya tengo algunos conocimientos interesantes en C, se lo básico sobre sockets, se también lo básico sobre hilos, crear arrays/matrices dinámicas con malloc, leer datos de un archivo con fgets, leer datos de teclado tanto con scanf como con fgets, la función rand(), memset(), malloc(), sizeof() los bucles que realmente son los mismos en todos los lenguajes, while, for, switch....manejar punteros, casting, estructuras, uniones, enumeraciones etc...

¿ Creeis que ya estoy más o menos preparado para el siguiente lenguaje ? es decir, que si ya podría decir que sé lo más importante de C para manejarme, ya se que esto se consigue sobre todo con la práctica, por lo que he creado también un pequeño proyecto que simula batallas pokemon en terminal, ya voy por la versión 1.1 y el programa, aunque es sencillo, es bastante grande, además uso una librería que hice para leer archivos de configuración.

Saludos.

PD: Esta pregunta va dirigida especialmente a ivancea96 ya que el ha respondido todas mis preguntas y ha podido ver mi avance.
#24
Programación C/C++ / Re: Pequeña duda sobre GCC
3 Septiembre 2015, 12:23 PM
Gracias :)
#25
Cita de: someRandomCode en  2 Septiembre 2015, 17:22 PM
INADDR_ANY es un macro definido con un valor que indica que cualquier direccion le sirve para la entrada..

Gracias, solucionado :)
#26
Programación C/C++ / Pequeña duda sobre GCC
2 Septiembre 2015, 17:07 PM
Hola a tod@s, resulta que algunas veces, para que al compilar se reconozcan ciertas librerías necesito hacer un -l(libreria) si no no me la reconoce, por ejemplo, al compilar algo que usa math.h sería:

gcc pruebas.c -o pruebas -lmath

O si uso threads:

gcc pruebas.c -o pruebas -lpthread

¿ Por que tengo que linkearla si ya la defino con include ?.

Saludos.
#27
Cita de: ivancea96 en  2 Septiembre 2015, 14:27 PM
(struct sockaddr*) &server

Le pasa un puntero a la estructura.

*((int*)fd)
fd es void*, así que primero hace un cast a int*. Luego, accede al valor con la desreferencia (*).

&sin_size

Le pasa un puntero a sin_size.

Muchísimas gracias, ya me ha quedado claro.

Saludos.

PD: Una última pregunta sobre este tema, para que sirve "INADDR_ANY" ?
#28
Hola a tod@s, ahora me ha dado por intentar aprender sockets en C, y en si mismo no es muy complicado pero hay unas cuantas lineas que me dan hasta miedo jeje, pongo el código que estoy leyendo:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define PORT 1024
#define BACKLOG 2

void* do_some_thing(void*);

int main()
{
  int fd;
  struct sockaddr_in server;

  pthread_t thread1;

  /* Limpiamos la pantalla */
  system("clear");

  /* Creamos el socket */
  if ((fd=socket(AF_INET, SOCK_STREAM, 0)) == -1)
  {
     printf("\t*error en la creacion del socket\n");
     return -1;
  }
  server.sin_family = AF_INET;
  server.sin_port = htons(PORT);
  server.sin_addr.s_addr = INADDR_ANY;
  bzero(&(server.sin_zero), 8);

  if(bind(fd, (struct sockaddr*) &server, sizeof(struct sockaddr)) == -1)
  {
     printf("\t*error en el BIND\n");
          return -1;
  }
  /* Ponemos el socket a la escucha */
  if(listen(fd, BACKLOG) == -1)
  {
     printf("\t*error en el LISTEN\n");
          return -1;
  }
  if(pthread_create( &thread1, NULL, do_some_thing, &fd) != 0)
  {
     printf("\t*error en pthread_create\n");
     return -1;
  }
  if(pthread_join( thread1, NULL) != 0)
  {
     printf("\t*error en pthread_join\n");
     return -1;
  }
  printf("***SERVER DONE***\n");
  return 0;
}

void* do_some_thing(void* fd)
{
  int fd2;
  struct sockaddr_in client;
  socklen_t sin_size;
  char Buffer[100];

  sin_size = sizeof(struct sockaddr_in);

  fd2 = accept(*((int*)fd), (struct sockaddr*)&client, &sin_size);
  printf("***SERVER START***\n");
  while (sin_size != 0)
  {
     sin_size= recv(fd2, Buffer, 100,0);
     if (sin_size > 0)
     {
        Buffer[sin_size-1]='\0';
        printf("Cadena Recibida: %s\n", Buffer);

        if(!strcmp(Buffer, "salir")) sin_size= 0;
     }
  }
  if(close(fd2) != 0)
  {
     printf("\t*error en close thread\n");
     return (void*)-1;
  }
  fd2 = 0;
  printf("GOOD BYE\n");
  return NULL;
}


Con lo que no me aclaro es con las lineas 37 y 71, se perfectamente lo que hacen esas funciones, con lo que me hago un lio es con tanto puntero usándose al mismo tiempo, que ya no se ni cual es el "resultado" de tanto * y & y tanto paréntesis, si alguien me lo explicara detalladamente se lo agradecería un montón.

Y ya de paso, ¿ Hay alguna manera más sencilla de usar sockets en C? (para linux).

Gracias.
#29
El programa que has puesto compila y funciona perfectamente, creo que te refieres a como "forzar" al usuario a tipear un número y no una letra, si es así, siento decirte que no se puede, solo se puede hacer lo que has hecho tu, comprobar si es un número y en caso negativo dar un error.

Saludos.
#30
Cita de: MCKSys Argentina en 30 Agosto 2015, 11:49 AM
De aquí sale:

Ya puedes sacar tus propias conclusiones...  ;)

Saludos!


Vamos que no recomiendan usar C/C++ a no ser que tu aplicación requiera mucho rendimiento, por lo que para aplicaciones de ambito general, lo suyo es usar Java.