/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Programando en Sockets 3er tema...

 
      Índice del Foro elrincondelc.com -> Programación en Servidores
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
Diabliyo



Registrado: 14 Abr 2004
Mensajes: 317
Ubicación: En la Luna

MensajePublicado: 08/04/2005 9:00 am
Título: Programando en Sockets 3er tema...

Hola:

Bueno aqui les dejo mi 2do programa de sockets, voy avanzando lento ( por razones universitarias ), pero estoy echandole ganas, ya sabiendo usar la funcion select(), podemos tener una mejor rpespectiva sobre todo lo que podemos hacer en sockets, ya sea orientacion a buena programacion, hacking, cracking o chekeo de bug y vulnerabilidades en la red.... La unica opcion que queda es buscar y leer sobre las diferentes funciones que nos proporciona Unix ( mas windows no ), esas funciones con las cuales podemos obtener pequenas resenas de los servidores y asi ir aumentando la dificultad para ir aprendiendo mas Very Happy.....

Este programa es el puro Servidor. Lo que hace es:

Realiza el sockets para aceptar conexiones de los clientes, los va guardando en un registro de descriptores de sockets, por medio de la funcion select() podemos estar escuchando en todos los descriptores de sockets sin necesidad de esperar un recv(), y tenemos la opcione de dictaminar la condicion del cliente gracias a los valores que retorna recv, si es:

-1 hubo problemas al recivir los datos.
0 el usuario se desconecto.
1 o mas ( dependiendo el tamano de los datos ) pues recivimos datos Very Happy.

La forma de uso es:

1. Quitas el firewall de Linux o abres el puerto 15005
2. Ejecutas el servidor: ./servidor[b]
3. Abres TELNET y conectas:
[b]telnet localhost 15005
<--- en caso que te conectes TU mismo.
telnet TUIP 15005 en caso que le pidas a un amigo conectarse.

NOTA: si vas a platicar con el necesitas conectarte al servidor por telnet TU ( como el servidor ) y tu amigo ( como el NO servidor, pero CLIENTE ).

BUGS del PROGRAMA:
1. Tu como servidor ves todo tal y cual lo va escribiendo el texto tu amigo... ya sea si borra o se va escribiendo letra por letra.

2. Suele empalmarse el texto cuando envian al mismo tiempo

3. no te pide nombre al entrar al servidor. Por lo tanto trat de calarlo solo con una persona, porke sino NO vas a saber quien dice lo que se escribe Very Happy.

4. Le faltaro poder usar comandos y pedir NOMBRE al usuario.

ejemplo: servidor -kick USERNAME ( tu como servidor lo haces y lo sacas )
USERNAME dice> bla bla bla ( una ves que de su nombre, sabras quien dice algo )

5. Pues todos los demas que le encuentres al escribir, ya quepues es una version BETA Very Happy

Bueno me despido y ahi mas adelante posteo otro mas mejorado, ya que ahorita traigo en manos el Arbol AVL que ya tengo un buen diciendo y aun no posteo el codigo Razz.... Nos vemos..

NOTA: esta es para los despistados Very Happy.... Este codigo solo funciona en Unix/Linux.

byeeee
_________________

Volver arriba
Diabliyo



Registrado: 14 Abr 2004
Mensajes: 317
Ubicación: En la Luna

MensajePublicado: 08/04/2005 9:10 am
Título:

Hola:

No puedo postear el codigo... no me permite poner las etiquetas CODE... me sale una pagina de PHP-Nucke jajaja :d... cuidado con eso...

Bueno aqui esta:

-------------> DESCARGAR <-----------

byeeeeeee
_________________

Volver arriba
Diabliyo



Registrado: 14 Abr 2004
Mensajes: 317
Ubicación: En la Luna

MensajePublicado: 02/07/2005 6:26 am
Título:

Hola:

Aquie sta el codigo.. ya que ele nlaze esta jodido jajaj..

byee Razz

Código:
/*
Programa Servidor que Abre el Socket 15005

--- UTILIZACION ---
Abrir el Ejecutable ( en Unix/Linux ), y automaticamente se crea el socket para recivir y enviar por el
puerto 15005.
Ahora abre una ventana de TELNET y conecta asi:

Si eres una makina de la RED, solo conectate desde TELNET a la IP donde esta activado o corriendo el Servidor
Si eres el mismo Servidor, solo tipea tu IP loopback que por lo general es: 120.0.0.1 o localhost   ;)

Coder: Diabliyo
e-mail:
Nacionalidad: Reynosa, Tamaulipas, Mexico ;)
Codigo: socket_Diabliyo.c
Requisitos: Sistema
*/

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/socket.h>
#include <errno.h>

#define BACKLOG 5
#define N 150
#define PORT 15005

/*Prototipos*/
int servidor_socket( int sockds );
int cliente_socket( int sockds_c, int sockds );
int recivir( char *buf, int sockds );
int enviar( char *cad, int cliente );
void chat_enviar( int i, int sockds, int sockds_max, fd_set registro, char *buf );

void chat_enviar( int i, int sockds, int sockds_max, fd_set registro, char *buf )
   {
   int j;
      
   for( j=0; j<=sockds_max; j++ )
      {
      if( FD_ISSET( j, ®istro ) )
         {
         if( j!=sockds && j!=i )
            {
            if( enviar( buf, j ) == -1 )
               {
               perror( "send" );
               getchar();
               }
            }
         }
      }
   }

int enviar( char *cad, int cliente )
   {
   int bytes_n, size_c;
      
   size_c= strlen( cad );
   bytes_n= send( cliente, cad, size_c, 0 );
   return bytes_n;
   }

int recivir( char *buf, int sockds )
   {
   int bytes_n;
   
   bytes_n= recv( sockds, buf, N, 0 );
   buf[bytes_n]='\0';
   return bytes_n;
   }

int cliente_socket( int sockds_c, int sockds )
   {
   int size_c;
   struct sockaddr_in cliente;
   
   size_c= sizeof( cliente );
   if( ( sockds_c= accept( sockds, (struct sockaddr *)&cliente, &size_c ) ) == -1 )
      {
      perror( "accept" );
      getchar();
      return -1;
      }
   printf( "\n\nnueva conexion establecida con: %s   ID: %i", inet_ntoa( cliente.sin_addr ), sockds_c );
   return sockds_c;
   }

int servidor_socket( int sockds )
   {
   struct sockaddr_in servidor;
   int yes=1;
   
   if( ( sockds= socket( AF_INET, SOCK_STREAM, 0 ) ) == -1 )
      {
      perror( "socket" );
      getchar();
      return -1;
      }
      
   servidor.sin_family= AF_INET;
   servidor.sin_port= htons( PORT );
   servidor.sin_addr.s_addr= INADDR_ANY;
   memset( &(servidor.sin_zero), '\0', 8 );
      
   if( bind( sockds, (struct sockaddr *)&servidor, sizeof( servidor ) ) == -1 )
      {
      perror( "bind" );
      getchar();
      return -1;
      }
      
   if( listen( sockds, BACKLOG ) == -1 )
      {
      perror( "listen" );
      getchar();
      return -1;
      }
   return sockds;
   }

int main()
   {
   fd_set registro, registro_aux;
   int sockds, sockds_c, sockds_max, i, j, bytes_n;
   char buf[N];
 
   FD_ZERO( ®istro );
   FD_ZERO( ®istro_aux);
      
   if( ( sockds= servidor_socket( sockds ) ) == -1 )
      exit(1);
   
   FD_SET( sockds, ®istro ); /*Agregamos el socker principal al registro*/
   sockds_max= sockds; /*el contador de Descriptores de Sockets ( sockds_max ) guarda el contenido del descriptor principal ( sockds )*/
   for(;;)
      {
      registro_aux= registro; /*hacemos copia del registri principal, en "registro_aux"*/
      if( select( sockds_max+1, ®istro_aux, NULL, NULL, NULL ) == -1 )
         {
         perror( "select" );
         getchar();
         exit(1);
         }
      for( i=0; i<=sockds_max; i++ )
         {
         if( FD_ISSET( i, ®istro_aux ) )
            {
            if( i==sockds )
               {
               if( ( sockds_c= cliente_socket( sockds_c, sockds ) ) == -1 )  /*Acepta la conexion del cliente*/
                  exit(1);
               else
                  {
                  FD_SET( sockds_c, ®istro ); /*Agrega el descriptor del cliente al registro*/
                  if( sockds_c>sockds_max )   sockds_max= sockds_c; /*Checa y actualiza el contador de descriptores ( sockds_mx )*/
                  chat_enviar( sockds, sockds, sockds_max, registro, "-------- Conexion Recivda -------\n" );
                  }
               }
            else
               {
               if( ( bytes_n= recivir( buf, i ) ) <=0 )
                  {
                  switch( bytes_n )
                     {
                     case 0:
                        printf( "\n\nEl Cliente %i Cerro la Conexion.", i );
                        chat_enviar( sockds, sockds, sockds_max, registro, "-------- Se ha Desconectado --------\n" );
                        break;
                     case -1:
                        perror( "recv" );
                        getchar();
                        break;
                     }
                  closesocket( i );
                  FD_CLR( i, ®istro );
                  }
               else
                  chat_enviar( i, sockds, sockds_max, registro, buf );
               }
            }
         }
      }
   printf( "\n\nPulsa para salir...." );
   getchar();
   closesocket( sockds );
   return 0;
   }

_________________

Volver arriba
Diabliyo



Registrado: 14 Abr 2004
Mensajes: 317
Ubicación: En la Luna

MensajePublicado: 21/12/2006 10:15 am
Título:

Hola:

El siguiente link es alterno a este post, ya que es para Sistemas Windows con compilador DevC++...

----> http://www.elrincondelc.com/portal/modules.php?name=Forums&file=viewtopic&t=8350 <----

Espero y les sirva de algo !!

byee
_________________

Volver arriba
      Índice del Foro elrincondelc.com -> Programación en Servidores
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com