Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: snake_linux en 3 Septiembre 2015, 12:29 pm



Título: Sobre mis conocimientos de C
Publicado por: snake_linux en 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.


Título: Re: Sobre mis conocimientos de C
Publicado por: ivancea96 en 3 Septiembre 2015, 14:43 pm
Cuando de verdad estés preparado, sabrás que puedes manejar el lenguaje que quieras, con solo mirar información sobre él, o tal vez algún ejemplo.

De todos modos, si C es tu primer lenguaje, está bien que mires hacia otros para distinguir entre <programar> y <programar C>. Tu meta es <programar>.

De todos modos, una forma muy simple de saber si sabes un lenguaje bien, es planteandote ertos. Ya no digo que crees los códigos, tan solo preguntarte si lo puedes hacer o no.
Por ejemplo:
-Si te digo que hagas un programa que lea de https://www.humblebundle.com/ (https://www.humblebundle.com/) y haga un listado de sus juegos en txt, ¿lo harías?
-Y si te digo que hagas un servidor o un cliente IRC, ¿lo conseguirías?

Tu mismo. Sé que C es un lenguaje algo complicado para hacer estas cosas desde 0. Se hace, pero lleva un buen rato. El problema es, ¿hay algo que desconozcas que te inhiba de hacer estas tareas? De ser así, ¿te costaría mucho adaptarte y conocerlo, rápido y eficientemente?

Este es mi examen. Hay muchas cosas, pero es difícil englobarlas todas. La capacidad de entenderlas y aplicarlas rápidamente es fundamental.

Comenta qué opinas.


Título: Re: Sobre mis conocimientos de C
Publicado por: snake_linux en 3 Septiembre 2015, 15:03 pm
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.


Título: Re: Sobre mis conocimientos de C
Publicado por: ivancea96 en 3 Septiembre 2015, 15:41 pm
Desde luego, hay lenguajes que te dan muchas cosas hechas. Pero hacer eso, un bot simple de IRC, es una buena práctica. Además, IRC es un protocolo sencillo, que se sigue utilizando.
Prueba.


Título: Re: Sobre mis conocimientos de C
Publicado por: snake_linux en 3 Septiembre 2015, 16:52 pm
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í:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <strings.h>
  5. #include <unistd.h>
  6. #include <sys/socket.h>
  7. #include <netinet/in.h>
  8. #include <arpa/inet.h>
  9. #include <netdb.h>  
  10.  
  11. int main(int argc, char *argv []) {
  12.  
  13.    int mysocket;
  14.    struct sockaddr_in server;
  15.    struct hostent *he;
  16.  
  17.    if ((he=gethostbyname(argv[1]))==NULL){      
  18.      /* llamada a gethostbyname() */
  19.      printf("gethostbyname() error\n");
  20.      exit(-1);
  21.   }
  22.  
  23.   if ((mysocket=socket(AF_INET, SOCK_STREAM, 0))==-1){  
  24.      /* llamada a socket() */
  25.      printf("socket() error\n");
  26.      exit(-1);
  27.   }
  28.  
  29.    server.sin_family = AF_INET;
  30.   server.sin_port = htons(6667);
  31.   /* htons() es necesaria nuevamente ;-o */
  32.   server.sin_addr = *((struct in_addr *)he->h_addr);  
  33.   /*he->h_addr pasa la información de ``*he'' a "h_addr" */
  34.   bzero(&(server.sin_zero),8);
  35.  
  36.   if(connect(mysocket, (struct sockaddr *)&server,
  37.      sizeof(struct sockaddr))==-1){
  38.      /* llamada a connect() */
  39.      printf("connect() error\n");
  40.      exit(-1);
  41.   }
  42.   printf("conexion establecida\n");
  43.    send(mysocket,"NICK Snake\r\n",strlen("NICK Snake\r\n"),0);
  44.    send(mysocket,"USER Snake\r\n",strlen("USER Snake\r\n"),0);
  45.    send(mysocket,"JOIN #amor\r\n",strlen("JOIN #amor\r\n"),0);
  46. send(mysocket,"PRIVMSG #amor :Hello world!\r\n",strlen("PRIVMSG #amor :Hello world!\r\n"),0);
  47. close(mysocket);
  48.  
  49.  
  50. }

offtopic: He estado viendo como se usan los sockets en Python y no tiene comparación... en C me resulta muy dificil comprenderlo.


Título: Re: Sobre mis conocimientos de C
Publicado por: kondrag_X1 en 3 Septiembre 2015, 17:51 pm
lo malo de un lenguaje es que lo vas olvidando si no lo practicas. Hablo desde la experiencia así que si vas a tocar otros lenguajes hazte pequeñas chorradas en C para que no se te olvide. Es mi consejo un saludo.


Título: Re: Sobre mis conocimientos de C
Publicado por: ivancea96 en 3 Septiembre 2015, 20:26 pm
El comando USER es incorrecto.
Citar
USER username hostname servername :realname
Así es.


Título: Re: Sobre mis conocimientos de C
Publicado por: snake_linux en 4 Septiembre 2015, 00:44 am
El comando USER es incorrecto.Así es.

No es el programa en C, es el server por que he modificado un .py que encontré en internet, muy sencillo, y el recv me da lo siguiente:

Código:
:ariel.chathispano.com NOTICE IP_LOOKUP :*** Found your hostname (CACHED!).

El código python que he usado es:

Código
  1. import socket
  2. import string
  3.  
  4. HOST="irc.irc-hispano.org"
  5. PORT=6667
  6. NICK="Snake"
  7. IDENT="Snake"
  8. REALNAME="Snake"
  9. CHAN="#amor"
  10. readbuffer=""
  11. s=socket.socket( )
  12. s.connect((HOST, PORT))
  13. s.send("NICK %s\r\n" % NICK)
  14. s.send("USER %s %s :%s\r\n" % (IDENT, HOST, REALNAME))
  15. s.send("JOIN :%s\r\n" % CHAN)
  16. s.send("PRIVMSG %s hola!\n" % CHAN)
  17. print s.recv(1000000)


Título: Re: Sobre mis conocimientos de C
Publicado por: ivancea96 en 4 Septiembre 2015, 11:17 am
offtopic: He estado viendo como se usan los sockets en Python y no tiene comparación... en C me resulta muy dificil comprenderlo.

En C, lo mejor es que te hagas una pequeña librería de funciones para manejarlo fácilmente.

En Python, en NodeJS, en PHP, en .NET, en Java, en la mayoría de lenguajes interpretados, un socket se hace en dos lineas. La librería estandar de C no trae sockets. En C lidias con el sistema operativo, lo que hace que tengas que hacer las cosas paso a paso. De todos modos, si bien es más tedioso, intenta comprenderlo, y verás que no es complejo.
Usando las API de los sistemas operativos, todo se hace paso a paso.


Título: Re: Sobre mis conocimientos de C
Publicado por: snake_linux en 4 Septiembre 2015, 11:33 am
En C, lo mejor es que te hagas una pequeña librería de funciones para manejarlo fácilmente.

En Python, en NodeJS, en PHP, en .NET, en Java, en la mayoría de lenguajes interpretados, un socket se hace en dos lineas. La librería estandar de C no trae sockets. En C lidias con el sistema operativo, lo que hace que tengas que hacer las cosas paso a paso. De todos modos, si bien es más tedioso, intenta comprenderlo, y verás que no es complejo.
Usando las API de los sistemas operativos, todo se hace paso a paso.

Creo que lo mejor es que use otro lenguaje para sockets, ya que entender los sockets en C ya lo he entendido, pero no son muy "prácticos" a no ser que te hagas una librería como bien dices.


Título: Re: Sobre mis conocimientos de C
Publicado por: snake_linux en 4 Septiembre 2015, 11:38 am
El caso es... ¿ Crees que estoy preparado ? ¿ Qué más o menos se C ?


Título: Re: Sobre mis conocimientos de C
Publicado por: ivancea96 en 4 Septiembre 2015, 13:57 pm
Apenas sé de ti lo que leí en el foro xD

Si quieres seguir con C, sigue con C. Si quieres aprender otro lenguaje, apréndelo.
Java, C#, PHP, JS, Python, Java, comparten sintaxis en su mayoría, así que te serán muy fáciles de aprender.


Título: Re: Sobre mis conocimientos de C
Publicado por: furciorifa en 6 Septiembre 2015, 03:37 am
Para saber si ya eres una eminencia en C debes probarte ya con los algoritmos, inducción matemática,compiladores, un sistema operativo pequeño por que no claro para eso necesitas bastantes estructuras de datos como pilas,nodos,colas,arboles binarios, y recursividad a pelo, ya que realmente domines esto lo demás será poder leer códigos de otros programadores y entenderlos al 100%.


Título: Re: Sobre mis conocimientos de C
Publicado por: someRandomCode en 6 Septiembre 2015, 14:27 pm
Si me decis que los sockets te parecen poco practicos cuando hasta en C (si, en C) se puede crear facilmente un objeto (con .ctor,.dtor y vtables) una vez y reutilizarlos 1000 teniendo acceso de bajo nivel, y es mas, usar sockets NIO facilmente sin bloquear en distintos threads con suma eficiencia (obviamente dependiendo del codigo) entonces te digo que no, no estas preparado.
Porque obviamente has estudiado solo una de las facetas de C, y no estas preparado para hacer ni un wrapper ni para leer las API directamente e inferir sus puntos fuertes..

Dicho eso, vas por muy buen camino sobre todo si intentas mejorarte a vos mismo! Segui asi!


Título: Re: Sobre mis conocimientos de C
Publicado por: snake_linux en 6 Septiembre 2015, 23:03 pm
Si me decis que los sockets te parecen poco practicos cuando hasta en C (si, en C) se puede crear facilmente un objeto (con .ctor,.dtor y vtables) una vez y reutilizarlos 1000 teniendo acceso de bajo nivel, y es mas, usar sockets NIO facilmente sin bloquear en distintos threads con suma eficiencia (obviamente dependiendo del codigo) entonces te digo que no, no estas preparado.
Porque obviamente has estudiado solo una de las facetas de C, y no estas preparado para hacer ni un wrapper ni para leer las API directamente e inferir sus puntos fuertes..

Dicho eso, vas por muy buen camino sobre todo si intentas mejorarte a vos mismo! Segui asi!

Gracias por los animos :)