Programando en Sockets 3er tema...

Temas relacionados con la programación de aplicaciones que funcionan sobre un servidor.
Responder
Mensaje
Autor
Avatar de Usuario
Diabliyo
Mensajes: 346
Registrado: 14/04/2004 11:00 pm
Ubicación: En la Luna
Contactar:

Programando en Sockets 3er tema...

#1 Mensaje por Diabliyo » 08/04/2005 9:00 am

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 :D.....

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 :D.

La forma de uso es:

1. Quitas el firewall de Linux o abres el puerto 15005
2. Ejecutas el servidor: ./servidor
3. Abres TELNET y conectas:
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 :D.

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 :D

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 :P.... Nos vemos..

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

byeeee
Imagen
Imagen

Avatar de Usuario
Diabliyo
Mensajes: 346
Registrado: 14/04/2004 11:00 pm
Ubicación: En la Luna
Contactar:

#2 Mensaje por Diabliyo » 08/04/2005 9:10 am

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
Imagen
Imagen

Avatar de Usuario
Diabliyo
Mensajes: 346
Registrado: 14/04/2004 11:00 pm
Ubicación: En la Luna
Contactar:

#3 Mensaje por Diabliyo » 02/07/2005 6:26 am

Hola:

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

byee :P

Código: Seleccionar todo

/*
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: darkdiabliyo@hotmail.com
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, &registro ) )
			{
			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( &registro );
	FD_ZERO( &registro_aux);
		
	if( ( sockds= servidor_socket( sockds ) ) == -1 )
		exit(1);
	
	FD_SET( sockds, &registro ); /*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, &registro_aux, NULL, NULL, NULL ) == -1 )
			{
			perror( "select" );
			getchar();
			exit(1);
			}
		for( i=0; i<=sockds_max; i++ )
			{
			if( FD_ISSET( i, &registro_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, &registro ); /*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, &registro );
						}
					else
						chat_enviar( i, sockds, sockds_max, registro, buf );
					}
				}
			}
		}
	printf( "\n\nPulsa para salir...." );
	getchar();
	closesocket( sockds );
	return 0;
	}
Imagen
Imagen

Avatar de Usuario
Diabliyo
Mensajes: 346
Registrado: 14/04/2004 11:00 pm
Ubicación: En la Luna
Contactar:

#4 Mensaje por Diabliyo » 21/12/2006 10:15 am

Hola:

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

----> http://www.elrincondelc.com/portal/modu ... pic&t=8350 <----

Espero y les sirva de algo !!

byee
Imagen
Imagen

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados