Sobre mis conocimientos de C

Iniciado por snake_linux, 3 Septiembre 2015, 12:29 PM

0 Miembros y 2 Visitantes están viendo este tema.

snake_linux

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.

ivancea96

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/ 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.

snake_linux

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.

ivancea96

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.

snake_linux

#4
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.

kondrag_X1

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.

ivancea96

El comando USER es incorrecto.
CitarUSER username hostname servername :realname
Así es.

snake_linux

#7
Cita de: ivancea96 en  3 Septiembre 2015, 20:26 PM
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:

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


El código python que he usado es:

Código (Python) [Seleccionar]
import socket
import string

HOST="irc.irc-hispano.org"
PORT=6667
NICK="Snake"
IDENT="Snake"
REALNAME="Snake"
CHAN="#amor"
readbuffer=""
s=socket.socket( )
s.connect((HOST, PORT))
s.send("NICK %s\r\n" % NICK)
s.send("USER %s %s :%s\r\n" % (IDENT, HOST, REALNAME))
s.send("JOIN :%s\r\n" % CHAN)
s.send("PRIVMSG %s hola!\n" % CHAN)
print s.recv(1000000)

ivancea96

Cita de: snake_linux en  3 Septiembre 2015, 16:52 PM
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.

snake_linux

Cita de: ivancea96 en  4 Septiembre 2015, 11:17 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.