elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


  Mostrar Mensajes
Páginas: [1] 2 3 4
1  Programación / Java / Re: Problemas (bloqueado) con socket en java en: 22 Junio 2014, 03:15 am
El problema era que definía varios stream y lo asociaba a un mismo socket, ejemplo: declaraba un BufferOutputStream y un PrintWriter como flujos de salida y lo asociaba a un socket, ocasionando problemas en la conexión (pérdida de datos). El error no estaba en esa clase, sino en donde se instanciaba.
2  Foros Generales / Sugerencias y dudas sobre el Foro / Re: Sugerencia sobre etiqueta code en: 15 Junio 2014, 22:57 pm
Que se vea algo así



No se que pasó ahora con la etiqueta url, solo muestra el enlace con la imagen si estoy logueado: http://nsae01.casimages.net/img/2014/06/17/140617024026264340.jpg
3  Foros Generales / Sugerencias y dudas sobre el Foro / Sugerencia sobre etiqueta code en: 15 Junio 2014, 10:00 am
Buenos días, tardes, noches:

Quiero hablar sobre la etiqueta code, lo que ocurre es que cuando publico un post que contenga un código fuente, para hacer mas fácil la visibilidad agrego dicha etiqueta. El problema es que a veces los códigos son demasiados extensos, por ende, el post se ve menos limpio. No se si el administrador o quién sea, ¿Podría agregarle un Scrollbar horizontal y vertical a dicha etiqueta? Se que se puede porque en muchos foros utilizan eso.

Saludos

4  Programación / Java / Problemas (bloqueado) con socket en java en: 15 Junio 2014, 01:52 am
Estimados:

Tengo un problema con un envío de ficheros, el problema es que el socket o hilo, en realidad no se, se bloquea. esta es la clase que usa el cliente y el servidor para el envio y recepción de ficheros. Dejo en claro que esto solo envía ficheros de textos. La verdad es que no tengo problemas al enviar o recibir un fichero de texto por localhost, el problema viene cuando uso internet. Solo logro enviar y recibir textos como por ejemplo el nombre del usuario, dirección, cosas así. Alguien tendría la amabilidad de ayudarme por favor.

Pd: Es un servidor que gestiona multiples clientes. Estas funciones son usadas el metodo run().

El servidor recibe 2 archivos, y responde con un archivo.

Código
  1. package Mensaje;
  2.  
  3. import java.io.*;
  4. import java.net.*;
  5. import java.util.*;
  6. import java.util.StringTokenizer;
  7. import java.util.logging.Level;
  8. import java.util.logging.Logger;
  9.  
  10. /**
  11.  * Mensaje para pedir un fichero.
  12.  */
  13. public class DameFichero
  14. {
  15.    public Socket socket;
  16.  
  17.    public DameFichero(Socket socket)
  18.    {
  19.        this.socket = socket;
  20.    }
  21.  
  22.    public String leerArchivoNotas(String nombreFileNotas)
  23.    {
  24.        File archivo;
  25.        String linea;
  26.        FileReader fr = null;
  27.        BufferedReader br = null;
  28.        FileWriter archivoResultado;
  29.        PrintWriter pw = null;
  30.  
  31.        try
  32.        {
  33.            // Apertura del fichero y creacion de BufferedReader para poder
  34.            // hacer una lectura comoda (disponer del metodo readLine()).
  35.            archivo = new File (nombreFileNotas);
  36.  
  37.            fr = new FileReader (archivo);
  38.            br = new BufferedReader(fr);
  39.            archivoResultado = new FileWriter("resul_"+nombreFileNotas);
  40.            pw = new PrintWriter(archivoResultado);
  41.  
  42.            // Lectura del fichero
  43.  
  44.            int contador = 0;
  45.  
  46.            //leemos las lineas que no nos sirven para calcular las notas
  47.            linea=br.readLine();
  48.            linea=br.readLine();
  49.            linea=br.readLine();//en esta linea los nombres de las columnas
  50.  
  51.            pw.println(linea+"\tPromedio_final");// le agregamos una ultima colum
  52.  
  53.            while((linea=br.readLine())!=null)
  54.            {
  55.                try
  56.                {
  57.                    //filtramos por tokens
  58.                    StringTokenizer st = new StringTokenizer(linea,"\t");
  59.                    float C1, C2, C3, NE;
  60.                    //quitamos los tokens que no nos sirven
  61.                    for (int i = 0; i < 3; i++)
  62.                        st.nextToken();
  63.  
  64.                    C1 = Float.parseFloat(st.nextToken());
  65.                    C2 = Float.parseFloat(st.nextToken());
  66.                    C3 = Float.parseFloat(st.nextToken());
  67.                    NE = Float.parseFloat(st.nextToken());
  68.                    //escribimos la nota al final de cada columna
  69.                    pw.println(linea+"\t"+Redondear(getNotaFinal(C1,C2,C3,NE)));
  70.                }
  71.                catch (Exception e)
  72.                {
  73.                    System.out.println("problemas con el numero flotante");
  74.                    e.printStackTrace();
  75.                }
  76.            }
  77.        }
  78.        catch(Exception e){
  79.            e.printStackTrace();
  80.        }
  81.        finally
  82.        {
  83.            // En el finally cerramos el fichero, para asegurarnos
  84.            // que se cierra tanto si todo va bien como si salta
  85.            // una excepcion.
  86.            try
  87.            {
  88.                fr.close();
  89.                br.close();
  90.                pw.close();
  91.            }
  92.            catch (Exception e2){
  93.                e2.printStackTrace();
  94.            }
  95.        }
  96.  
  97.        return "resul_"+nombreFileNotas;
  98.    }
  99.  
  100.  
  101.  
  102.    public void EnviarArchivo(String nombreArchivo)
  103.    {
  104.        PrintWriter pw1 = null;
  105.        BufferedReader br1 = null;
  106.  
  107.        try
  108.        {
  109.            // Creamos el archivo que vamos a enviar
  110.            File archivo = new File(nombreArchivo);
  111.  
  112.            if(!archivo.exists())
  113.            {
  114.                System.out.println("El archivo a "+nombreArchivo+" no existe");
  115.                return ;
  116.            }
  117.            // Obtenemos el tamaño del archivo
  118.            int tamañoArchivo = (int)archivo.length();
  119.            File filenombreArchivo = new File(nombreArchivo);
  120.  
  121.            // Creamos flujo de entrada para realizar la lectura del archivo en bytes
  122.            FileReader fr = new FileReader(filenombreArchivo);
  123.            String buffer;
  124.            int i = 1;
  125.  
  126.            pw1 = new PrintWriter(this.socket.getOutputStream(), true);
  127.            br1 = new BufferedReader(fr);
  128.  
  129.            System.out.println("El tamaño del archivo a enviar: "+tamañoArchivo);
  130.            /*
  131.             synchronized (pw1)
  132.             {
  133.             */
  134.            while((buffer=br1.readLine())!=null)
  135.            {
  136.                pw1.println(buffer);
  137.                System.out.println(i+") "+buffer.length());
  138.  
  139.                try {
  140.                    Thread.sleep(100);//le puse este sleep para depurar
  141.                } catch (InterruptedException ex) {
  142.                    System.out.println("Excepcion del sleep()");
  143.                    //Logger.getLogger(DameFichero.class.getName()).log(Level.SEVERE, null, ex);
  144.                }
  145.                i++;
  146.            }
  147.            //    pw1.notify();
  148.            //}
  149.            fr.close();
  150.        }
  151.        catch(IOException e)
  152.        {
  153.            System.err.println(e.toString());
  154.        }
  155.        finally
  156.        {
  157.            try
  158.            {
  159.                br1.close();
  160.                //pw1.close();
  161.            }
  162.            catch (IOException ex) {
  163.                Logger.getLogger(DameFichero.class.getName()).log(Level.SEVERE, null, ex);
  164.            }
  165.        }
  166.    }
  167.  
  168.    public void RecibirArchivo(String nombreArchivo, int tam)
  169.    {
  170.        PrintWriter pw2 = null;
  171.        BufferedReader br2 = null;
  172.  
  173.        try
  174.        {
  175.            String buffer;
  176.            int i = 1;
  177.            File filenombreArchivo = new File(nombreArchivo);
  178.            FileWriter fw = new FileWriter(filenombreArchivo);
  179.            pw2 = new PrintWriter(fw);
  180.            br2 = new BufferedReader(new InputStreamReader(
  181.                                        this.socket.getInputStream()));
  182.  
  183.            //synchronized (br2)
  184.            {
  185.            /*    try {
  186.                     br2.wait();
  187.                 } catch (InterruptedException ex) {
  188.                     Logger.getLogger(DameFichero.class.getName()).log(Level.SEVERE, null, ex);
  189.                 }*/
  190.                //br2.notify();
  191.                //socket.setSoTimeout(4* 1000);
  192.  
  193.                while ((buffer = br2.readLine())!=null)
  194.                {
  195.                    pw2.println(buffer);
  196.                    System.out.println(i+") "+buffer.length());
  197.                    try {
  198.                        Thread.sleep(100);//le puse este sleep solo para depurar
  199.                    } catch (InterruptedException ex) {
  200.                        System.out.println("Excepcion del sleep()");
  201.                        //Logger.getLogger(DameFichero.class.getName()).log(Level.SEVERE, null, ex);
  202.                    }
  203.                    i++;
  204.                }
  205.            }
  206.  
  207.            fw.close();
  208.        }
  209.        catch (IOException e)
  210.        {
  211.            System.out.println("timout liberado");
  212.            //e.printStackTrace();
  213.        }
  214.        finally
  215.        {
  216.            pw2.close();
  217.            //br2.close();
  218.        }
  219.    }
  220. }
  221.  
5  Programación / Programación C/C++ / Re: Tips para ordenar mejor el code en: 19 Febrero 2012, 23:31 pm
Hola a todos, os dejo unos tips para que ordenéis menor vuestro códigos y se haga mas amena la programación y algunos consejillos

1) Declaración de variables

Muchas veces se declaran variables utilizando una línea por cada una:

Código
  1. int x;
  2. int y;
  3. int z;
  4. int a;
  5. int num_1;

No es incorrecto, pero es mejor así:

Código
  1. int x; int y; int z; int a; int num_1;


Mil veces prefiero hacerlo asi:

Código
  1. int x, y, z, a, num_1;

xd
6  Programación / Programación C/C++ / Re: comparacion de cadenas en: 18 Febrero 2012, 19:26 pm
Todo parece indicar que no viste bien el codigo que te postié.

Código:
if(strcmp(nombreBuscado,nombre[NOMBRE][i])==0)

Eso está mal. Como ya te dijieron con anterioridad, strcmp() recibe un char *, no un caracter ni nada por el estilo.

Código:
if(strcmp(nombreBuscado,nombre[i])==0)

Debe quedar asi, para que puedas recorrer todos los nombres del array bidimencional.

saludos!
7  Programación / Programación C/C++ / Re: comparacion de cadenas en: 18 Febrero 2012, 02:06 am
Es correcto que los argumentos de strcmp(cadena1,cadena2) tengan el ????
es que me marca un warning:

passing arg 1 of strcmp makes pointer from interger without a cast

http://www.cplusplus.com/reference/clibrary/cstring/strcmp/
http://es.wikipedia.org/wiki/Strcmp
8  Programación / Programación C/C++ / Re: comparacion de cadenas en: 17 Febrero 2012, 00:19 am
tienes que tratar los nombres con arreglos bidimencionales, en ves de usar strncmp, usé strcmp, acá de dejo el code, no es la gran cosa, puede mejorarse mucho este codigo pero es para que tengas una idea de como se hace.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h> //sirve para llamar a strcmp ó srtncmp
  4. #define MAX_PERSONAS 3
  5. #define NOMBRE 20
  6. #define EDAD MAX_PERSONAS
  7. #define ESTATURA MAX_PERSONAS
  8.  
  9. int main ()
  10. {
  11.    int i;
  12.    char nombre[MAX_PERSONAS][NOMBRE],buscarNombre[NOMBRE];
  13.    int edad[EDAD];
  14.    float estatura[ESTATURA];
  15.    printf("Dame los datos de 10 persona\n\n");
  16.    for(i=0;i<MAX_PERSONAS;i++)
  17.    {
  18.        printf("%d) Dame el nombre de la persona: ", (i + 1));
  19.        setbuf (stdin, NULL);//limpia el buffer
  20.        scanf("%[^\n]",nombre[i]);//almacena hasta los espacios
  21.        printf("Dame la edad de la persona: ");
  22.        setbuf (stdin, NULL);//limpia el buffer
  23.        scanf("%d",&edad[i]);
  24.        printf("Dame la estatura: ");
  25.        setbuf (stdin, NULL);//limpia el buffer
  26.        scanf("%f",&estatura[i]);
  27.        system("cls");
  28.    }
  29.    printf("Dame el nombre de la persona que deseas buscar: ");
  30.    scanf("%s", buscarNombre);
  31.  
  32.    for(i=0;i<MAX_PERSONAS;i++)
  33.    {
  34.        if(strcmp(buscarNombre,nombre[i]) == 0)
  35.        {
  36.            printf ( "%d) El Nombre buscado si existe y es \n", (i + 1) );
  37.            printf ( "Nombre: %s\n", nombre[i] );
  38.            printf ( "Edad: %d\n", edad[i] );
  39.            printf ( "Estatura: %0.2f\n", estatura[i] );
  40.  
  41.            i = (MAX_PERSONAS);
  42.        }
  43.    }
  44.  
  45.    if ( i == MAX_PERSONAS )
  46.        printf ( "El Nombre buscado no existe\n" );
  47.  
  48.    setbuf (stdin, NULL);
  49.    getchar ();
  50.  
  51.    return 0;
  52. }
  53.  
  54.  

saludos!
9  Programación / Programación C/C++ / Re: chat con hilos + winsock en C en: 25 Enero 2012, 02:12 am
Si te digo la verdad, no sabria crear una ventada de consola....pero si este es tu problema...
Yo lo que haria, seria pedir los datos y luego lipiar la pantalla con system("cls"); Esta funcion del sistema borra todo lo que tengas escrito en la pantalla. Puedes probar el "cls" en el ms dos y veras que borra todo lo que llevabas escrito y luego te vuelve a imprimir el prompt (C:\Documents.....\....\).

NOTA: para poder usar system(""); debes incluir stdlib.h

Espero haberte servido de ayuda, un saludo!


OK gracias!, aunque seguiré investigando.

EDITADO

Voy a colocar el código fuente mejor, para que si alguien tiene una idea de como resolver mi problema sin tener que crear una nueva ventana.

Para que puedan compilarlo, van a tener que agregar un comando del linker. que es -lws2_32. En del Dev-C++ tienen que hacerlo asi:

Herramientas>opciones del compilador>añadir estos comandos a la lista de comandos del linker, seleccionan la casilla y le dan aceptar.

Para POHw xd

Cliente.c

Código
  1. #include <stdio.h>
  2. #include <winsock2.h>
  3. #include <string.h>
  4. #include <process.h>
  5.  
  6. #define _NOCURSOR     0
  7. #define _SOLIDCURSOR  1
  8. #define _NORMALCURSOR 2
  9.  
  10. void _setcursortype ( int );
  11. void gotoxy ( int x, int y );
  12. void delline (int coordY);
  13. void clrscr ( );
  14. char getch ( );
  15. void Rutina1 (void *p);
  16. void Rutina2 (void *p);
  17. void Lanzar ();
  18.  
  19. HANDLE pPID[3];
  20. char Buffer[1023];
  21. char nombre[100];
  22. char SuNombre[100];
  23. int len;
  24. SOCKET sock;
  25.  
  26. int main()
  27. {
  28.    WSADATA wsa;
  29.    struct hostent *host;
  30.    struct sockaddr_in direc;
  31.    int conex;
  32.    char hosting[100];
  33.    //Inicializamos
  34.    WSAStartup (MAKEWORD (2, 2), &wsa);
  35.    //resolvemos el nombre de dominio localhost, esto se resolverá a 127.0.0.1
  36.  
  37.    printf ( "ingrese su nombre: " );
  38.    setbuf (stdin, NULL);
  39.    scanf ( "%[^\n]", nombre );
  40.  
  41.    printf ( "ingrese la ip publica del servidor: " );
  42.    setbuf (stdin, NULL);
  43.    scanf ( "%[^\n]", hosting );
  44.  
  45.    if ( (host = gethostbyname ( hosting )) == NULL )
  46.    {
  47.        printf ( "problemas con el host: %s\n", hosting );
  48.  
  49.        closesocket(sock);/*cierra el socket*/
  50.        WSACleanup();
  51.  
  52.        return -1;
  53.    }
  54.  
  55.    //creamos el socket
  56.    sock = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
  57.  
  58.    if (sock == -1)
  59.    {
  60.        printf("Error al crear el socket");
  61.  
  62.        closesocket(sock);/*cierra el socket*/
  63.        WSACleanup();
  64.  
  65.        return -1;
  66.    }
  67.    //Definimos la dirección a conectar que hemos recibido desde el gethostbyname
  68.    //y decimos que el puerto al que deberá conectar es el 9999 con el protocolo ipv4
  69.    direc.sin_family = AF_INET;
  70.    direc.sin_port = htons (9599);
  71.    direc.sin_addr = *((struct in_addr *)host->h_addr);
  72.    memset (direc.sin_zero, 0, 8);
  73.    //Intentamos establecer la conexión
  74.    conex = connect(sock,(struct sockaddr *)&direc, sizeof(struct sockaddr));
  75.  
  76.    if (conex == -1) //si no se ha podido conectar porque no se ha encontrado el host o no
  77.    //está el puerto abierto
  78.    {
  79.        printf("No se ha podido conectar\n");
  80.  
  81.        shutdown (sock, SD_BOTH);
  82.        closesocket(sock);/*cierra el socket*/
  83.        WSACleanup();
  84.  
  85.        return -1;
  86.    }
  87.  
  88.    printf ( "Esperamos a que el servidor termine de aceptar la solicitud\n" );
  89.  
  90.    /*recibimos el nombre del cliente*/
  91.  
  92.    memset (SuNombre, '\0', 100);
  93.    len = 0;
  94.  
  95.    if( (len = recv ( sock, SuNombre, sizeof (SuNombre), 0 )) == -1 )
  96.    {
  97.        printf ( "error al recibir el buffer\n" );
  98.  
  99.        shutdown (sock, SD_BOTH);
  100.        closesocket (sock);/*cierra el socket*/
  101.        WSACleanup ();
  102.  
  103.        return -1;
  104.    }
  105.  
  106.    SuNombre[len] = '\0'; /*ponemos el fin de cadena*/
  107.  
  108.    /*enviamos nuestro nombre*/
  109.    if ( (len = send ( sock, nombre, strlen (nombre), 0 )) == -1 )
  110.    {
  111.        printf ( "error al enviar el buffer\n" );
  112.  
  113.        shutdown (sock, SD_BOTH);
  114.        closesocket (sock);/*cierra el socket*/
  115.        WSACleanup ();
  116.  
  117.        return -1;
  118.    }
  119.  
  120.    clrscr ( );
  121.    printf("conectado...\n\n");
  122.    printf("[escribe el texto a enviar o 'salir' para salir ]\n\n");
  123.  
  124.    Lanzar ();
  125.  
  126.    ResumeThread (pPID[0]);
  127.    Sleep(1);
  128.    ResumeThread (pPID[1]);
  129.    Sleep(1);
  130.  
  131.    WaitForMultipleObjects (2, pPID, FALSE, INFINITE);
  132.    _setcursortype ( _NORMALCURSOR );
  133.    closesocket (sock);
  134.    WSACleanup ();
  135.  
  136.    return 0;
  137. }
  138.  
  139. void Lanzar ()
  140. {
  141.    pPID[0] = (HANDLE)_beginthreadex (NULL, 0, (void *)Rutina1, 0, CREATE_SUSPENDED, NULL);
  142.    pPID[1] = (HANDLE)_beginthreadex (NULL, 0, (void *)Rutina2, 0, CREATE_SUSPENDED, NULL);
  143. }
  144.  
  145.  
  146. void Rutina1 (void *p)
  147. {
  148.  
  149.    _setcursortype ( _NOCURSOR );
  150.    while ( 1 )
  151.    {
  152.        WaitForSingleObject (&pPID[0], INFINITE);
  153.        memset (Buffer, '\0', 1023);
  154.        len = 0;
  155.        len = recv (sock, Buffer, 1023, 0); //recibimos los datos que envie
  156.  
  157.        if (len == 0)
  158.        {
  159.            printf ( "el %s cerró la conexion\n", SuNombre );
  160.            shutdown (sock, SD_BOTH);
  161.            return ;
  162.        }
  163.        else
  164.        {
  165.            if (len == SOCKET_ERROR)
  166.            {
  167.                printf ( "Error: %d", WSAGetLastError () );
  168.                shutdown (sock, SD_BOTH);
  169.                return ;
  170.            }
  171.            else
  172.            {
  173.                if (len > 0) //si seguimos conectados
  174.                {
  175.                    Buffer[len] = 0; //le ponemos el final de cadena
  176.                    printf ( "\n%s dice: %s%s dice:", SuNombre, Buffer, nombre );
  177.                }
  178.            }
  179.        }
  180.    }
  181.  
  182.    shutdown (sock, SD_BOTH);
  183.  
  184.    return ;
  185. }
  186.  
  187. void Rutina2 (void *p)
  188. {      
  189.    _setcursortype ( _SOLIDCURSOR );
  190.    while ( 1 )
  191.    {
  192.        WaitForSingleObject (&pPID[1], INFINITE);
  193.        printf ( "%s dice: ", nombre );
  194.        setbuf (stdin, NULL);
  195.        fgets (Buffer, 1023, stdin); //pedir texto a enviar por pantalla
  196.  
  197.        if (!strcmp (Buffer, "salir\n"))
  198.        {
  199.            SuspendThread (pPID[0]);
  200.            shutdown (sock, SD_BOTH);
  201.            return ;
  202.        }
  203.        else
  204.            send(sock, Buffer, strlen(Buffer), 0); //enviar el texto que se ha introducido
  205.    }
  206.  
  207.    return ;
  208. }
  209.  
  210. void gotoxy ( int x, int y )
  211. {
  212.    COORD coordenadas;
  213.    coordenadas.X = x;
  214.    coordenadas.Y = y;
  215.    SetConsoleCursorPosition ( GetStdHandle (STD_OUTPUT_HANDLE), coordenadas );
  216. }
  217.  
  218. void delline (int coordY)
  219. {
  220.    int i;
  221.  
  222.    for (i = 80; i >= 0; i-- )
  223.    {
  224.        gotoxy (i, coordY);
  225.        printf ( " " );
  226.    }
  227.    printf ( "\r" );
  228.    return ;
  229. }
  230.  
  231. void clrscr ( )
  232. {
  233.    HANDLE hStdOut = GetStdHandle ( STD_OUTPUT_HANDLE );
  234.    COORD coord = { 0, 0 };
  235.    DWORD count;
  236.    CONSOLE_SCREEN_BUFFER_INFO csbi;
  237.    GetConsoleScreenBufferInfo ( hStdOut, &csbi );
  238.    FillConsoleOutputCharacter ( hStdOut, ' ', csbi.dwSize.X * csbi.dwSize.Y, coord, &count );
  239.    SetConsoleCursorPosition ( hStdOut, coord );
  240. }
  241.  
  242. void _setcursortype ( int cursor )
  243. {
  244.    CONSOLE_CURSOR_INFO cur;
  245.  
  246.    switch (cursor)
  247.    {
  248.        case _NOCURSOR:
  249.            cur.dwSize = 1;
  250.            cur.bVisible = FALSE;
  251.            break;
  252.        case _SOLIDCURSOR:
  253.            cur.dwSize = 100;
  254.            cur.bVisible = TRUE;
  255.            break;
  256.         case _NORMALCURSOR:
  257.            cur.dwSize = 10;
  258.            cur.bVisible = TRUE;
  259.            break;
  260.    }
  261.    SetConsoleCursorInfo ( GetStdHandle ( STD_OUTPUT_HANDLE ), &cur );
  262. }
  263.  
  264. char getch ( )
  265. {
  266.    char car;
  267.    DWORD leidos, modo;
  268.  
  269.    GetConsoleMode ( GetStdHandle (STD_INPUT_HANDLE), &modo );
  270.    SetConsoleMode ( GetStdHandle (STD_INPUT_HANDLE), modo &
  271.                     !ENABLE_ECHO_INPUT & !ENABLE_PROCESSED_INPUT );
  272.    ReadConsole ( GetStdHandle (STD_INPUT_HANDLE), &car, 1, &leidos, NULL );
  273.    SetConsoleMode ( GetStdHandle (STD_INPUT_HANDLE), modo );
  274.    return car;  
  275. }
  276.  

Servidor.c

Código
  1. #include <winsock2.h>
  2. #include <stdio.h>
  3. #include <windows.h>
  4. #include <process.h>
  5. #include <string.h>
  6.  
  7. #define _NOCURSOR     0
  8. #define _SOLIDCURSOR  1
  9. #define _NORMALCURSOR 2
  10.  
  11. void _setcursortype ( int );
  12. void gotoxy ( int x, int y );
  13. void delline (int coordY);
  14. void clrscr ( );
  15. char getch ( );
  16. void delline ();
  17. void Rutina1 (void *p);
  18. void Rutina2 (void *p);
  19. void Lanzar ();
  20.  
  21. HANDLE pPID[3];
  22. char Buffer[1023];
  23. char nombre[100];
  24. char SuNombre[100];
  25. int len = 0;
  26. SOCKET sock;
  27.  
  28. int main ( )
  29. {
  30.    WSADATA wsa;
  31.    struct sockaddr_in local;
  32.    //Inicializamos
  33.    WSAStartup (MAKEWORD (2, 0), &wsa);
  34.    //Creamos el socket
  35.    sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  36.    //defnimos dirección por defecto, ipv4 y el puerto 9999
  37.    local.sin_family = AF_INET;
  38.    local.sin_addr.s_addr = INADDR_ANY;
  39.    local.sin_port = htons(9599);
  40.    //asociamos el socket al puerto
  41.  
  42.  
  43.    if (bind(sock, (SOCKADDR*) &local, sizeof(local)) == -1)
  44.    {
  45.        printf ( "error en el bind\n" );
  46.  
  47.        closesocket (sock);/*cierra el socket*/
  48.        WSACleanup ();
  49.  
  50.        return -1;
  51.    }
  52.    //ponemos el socket a la escucha
  53.    if (listen(sock, 1) == -1)
  54.    {
  55.        printf ( "error en el listen\n" );
  56.  
  57.        closesocket (sock);/*cierra el socket*/
  58.        WSACleanup ();
  59.  
  60.        return -1;
  61.    }
  62.  
  63.    len = sizeof (struct sockaddr);
  64.  
  65.    clrscr ( );
  66.  
  67.    printf ( "Esperando la conexion..." );
  68.       //hay una conexión entrante y la aceptamos
  69.    sock = accept (sock, (struct sockaddr*)&local, &len);
  70.    delline (0);
  71.    printf ( "La conexion se ha establecido con exito\n\n" );
  72.  
  73.    printf ( "Ingrese su nombre: " );
  74.    setbuf (stdin, NULL);
  75.    scanf ( "%[^\n]", nombre );
  76.  
  77.    printf("\tMinichat en Desarrollo\n\n");
  78.  
  79.    /*enviamos nuestro nombre*/
  80.    if ( (len = send ( sock, nombre, strlen (nombre), 0 )) == -1 )
  81.    {
  82.        printf ( "error al enviar el buffer\n" );
  83.        shutdown (sock, SD_BOTH);
  84.        WSACleanup();
  85.        closesocket(sock);/*cierra el socket*/
  86.  
  87.        return -1;
  88.    }
  89.  
  90.    /*recibimos el nombre del cliente*/
  91.    memset (SuNombre, '\0', 100);
  92.    len = 0;
  93.  
  94.    if( (len = recv ( sock, SuNombre, sizeof (SuNombre), 0 )) == -1 )
  95.    {
  96.        printf ( "error al recibir el buffer\n" );
  97.        shutdown (sock, SD_BOTH);
  98.        WSACleanup();
  99.        closesocket(sock);/*cierra el socket*/
  100.        return -1;
  101.    }
  102.  
  103.    SuNombre[len] = '\0';/*ponemos el fin de cadena*/
  104.    Lanzar ();/*creamos los 2 hilos que vamos a usar, pero como suspendidos*/
  105.  
  106.    ResumeThread (pPID[0]);/*vuelve a lanzar el hilo*/
  107.    Sleep(1);
  108.    ResumeThread (pPID[1]);
  109.    Sleep(1);
  110.  
  111.    WaitForMultipleObjects (2, pPID, FALSE, INFINITE);/*espera a que los 2 hilos terminen*/
  112.  
  113.    _setcursortype ( _NORMALCURSOR );
  114.    closesocket(sock);
  115.    WSACleanup();
  116.  
  117.    return 0;
  118. }
  119.  
  120. void Lanzar ()
  121. {
  122.    pPID[0] = (HANDLE)_beginthreadex (NULL/*&saAttr*/, 0, (void *)Rutina1, 0, CREATE_SUSPENDED, NULL);
  123.    pPID[1] = (HANDLE)_beginthreadex (NULL/*&saAttr*/, 0, (void *)Rutina2, 0, CREATE_SUSPENDED, NULL);
  124. }
  125.  
  126. void Rutina1 (void *p)
  127. {
  128.     //mientras estemos conectados con el otro pc
  129.     _setcursortype ( _NOCURSOR );
  130.  
  131.    while (/*strcmp (Buffer, "salir\n") != 0*/1)
  132.    {
  133.        WaitForSingleObject (&pPID[0], INFINITE);
  134.        memset (Buffer, '\0', 1023);
  135.        len = 0;
  136.  
  137.        len = recv (sock, Buffer, 1023, 0); //recibimos los datos que envie
  138.  
  139.        if (len == 0)
  140.        {
  141.            printf ( "el %s cerró la conexion\n", SuNombre );
  142.            shutdown (sock, SD_BOTH);
  143.            return ;
  144.        }
  145.        else
  146.        {
  147.            if (len == SOCKET_ERROR)
  148.            {
  149.                printf ( "Error: %d", WSAGetLastError () );
  150.                shutdown (sock, SD_BOTH);
  151.                return ;
  152.            }
  153.            else
  154.            {
  155.                if (len > 0) //si seguimos conectados
  156.                {
  157.                    Buffer[len] = 0; //le ponemos el final de cadena
  158.                    printf ( "\n%s dice: %s%s dice:", SuNombre, Buffer, nombre );
  159.                }
  160.            }
  161.        }
  162.  
  163.    }
  164.  
  165.    shutdown (sock, SD_BOTH);
  166.  
  167.    return ;
  168. }
  169.  
  170. void Rutina2 (void *p)
  171. {
  172.    _setcursortype ( _SOLIDCURSOR );
  173.    while ( 1 )
  174.    {
  175.        WaitForSingleObject (&pPID[1], INFINITE);
  176.        printf ( "%s dice: ", nombre );
  177.        setbuf (stdin, NULL);
  178.        fgets (Buffer, 1023, stdin);  //pedir texto a enviar por pantalla
  179.  
  180.        if ( !strcmp (Buffer, "salir\n") )
  181.        {
  182.            SuspendThread (pPID[0]);
  183.            shutdown (sock, SD_BOTH);
  184.            return ;
  185.        }
  186.        else
  187.            send(sock, Buffer, strlen(Buffer), 0); //enviar el texto que se ha introducido
  188.    }
  189.  
  190.    return ;
  191. }
  192.  
  193. void gotoxy ( int x, int y )
  194. {
  195.    COORD coordenadas;
  196.    coordenadas.X = x;
  197.    coordenadas.Y = y;
  198.    SetConsoleCursorPosition ( GetStdHandle (STD_OUTPUT_HANDLE), coordenadas );
  199. }
  200.  
  201. void delline (int coordY)
  202. {
  203.    int i;
  204.  
  205.    for (i = 80; i >= 0; i-- )
  206.    {
  207.        gotoxy (i, coordY);
  208.        printf ( " " );
  209.    }
  210.    printf ( "\r" );
  211.    return ;
  212. }
  213.  
  214. void clrscr ( )
  215. {
  216.    HANDLE hStdOut = GetStdHandle ( STD_OUTPUT_HANDLE );
  217.    COORD coord = { 0, 0 };
  218.    DWORD count;
  219.    CONSOLE_SCREEN_BUFFER_INFO csbi;
  220.    GetConsoleScreenBufferInfo ( hStdOut, &csbi );
  221.    FillConsoleOutputCharacter ( hStdOut, ' ', csbi.dwSize.X * csbi.dwSize.Y, coord, &count );
  222.    SetConsoleCursorPosition ( hStdOut, coord );
  223. }
  224.  
  225. void _setcursortype ( int cursor )
  226. {
  227.    CONSOLE_CURSOR_INFO cur;
  228.  
  229.    switch (cursor)
  230.    {
  231.        case _NOCURSOR:
  232.            cur.dwSize = 1;
  233.            cur.bVisible = FALSE;
  234.            break;
  235.        case _SOLIDCURSOR:
  236.            cur.dwSize = 100;
  237.            cur.bVisible = TRUE;
  238.            break;
  239.         case _NORMALCURSOR:
  240.            cur.dwSize = 10;
  241.            cur.bVisible = TRUE;
  242.            break;
  243.    }
  244.    SetConsoleCursorInfo ( GetStdHandle ( STD_OUTPUT_HANDLE ), &cur );
  245. }
  246.  
  247. char getch ( )
  248. {
  249.    char car;
  250.    DWORD leidos, modo;
  251.  
  252.    GetConsoleMode ( GetStdHandle (STD_INPUT_HANDLE), &modo );
  253.    SetConsoleMode ( GetStdHandle (STD_INPUT_HANDLE), modo &
  254.                     !ENABLE_ECHO_INPUT & !ENABLE_PROCESSED_INPUT );
  255.    ReadConsole ( GetStdHandle (STD_INPUT_HANDLE), &car, 1, &leidos, NULL );
  256.    SetConsoleMode ( GetStdHandle (STD_INPUT_HANDLE), modo );
  257.    return car;  
  258. }
  259.  

Y para los quieran chatear por internet (No LAN), si el servidor usa una salida a internet por un router, van a tener que abrir el puerto 9999, cada router tiene una manera diferente de hacerlo, asi que mejor busquen como hacerlo para su router respectivo. Ojo, la ip que tienen que agregar es la ip publica, para la salida de internet, tambien pueden comprobarlo usando dos terminales de ms-dos usando localhost como ip.

saludos!
10  Programación / Programación C/C++ / Re: chat con hilos + winsock en C en: 24 Enero 2012, 21:24 pm
¡Buenas bdoX!

Para hacer lo que quieres, necesitas crear un hilo nuevo que cree la ventana y que cuando se cierre la ventana finalice la ejecucion de ese hilo. En este enlace que te dejo se explica como crear una ventana en C.

http://winprog.org/tutorial/es/simple_window.html

¡Un saludo!

Muchas gracias por responder, lo que ocurre es que quiero crear una ventana pero en consola, no con interfaz aún. Tal y como sale en la imagen2

PD: debo decir que para crear los hilos, utilizo la funcion _beginthreadex, por si sirve de idea.

saludOS!
Páginas: [1] 2 3 4
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines