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

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  chat con hilos + winsock en C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: chat con hilos + winsock en C  (Leído 3,372 veces)
bdoX

Desconectado Desconectado

Mensajes: 35



Ver Perfil
chat con hilos + winsock en C
« en: 24 Enero 2012, 20:58 pm »

Hola a todos:

Les cuento, ya tengo implementado un chat bidireccional hecha en winsok, para ello tuve que hacerlo con hilos de ejecucion, hasta el momento el programa no acepta mas de un cliente. Funciona bien, el problema es que se ve asi:



ocurre que se ve feo que ingrese los datos, y que este ahí mismo el historial de converzación, por eso tengo ganas de el mismo hilo me genere una ventana aparte donde pueda ingresar los datos y una ventana donde pueda ver los datos del historial de converzación, algo asi:



Lo mismo para el cliente.

Se que la existe una funcion llamada CreateProcess() que al pasarle un flag a la funcion, me genera otra ventana, pero lo que yo no quiero es ejecutar desde otro *.exe a otro *.exe. La idea es tener un solo ejecutable nomas. Ojalá alguien pueda ayudarme please!

saludOS!




En línea

soyloqbuskas

Desconectado Desconectado

Mensajes: 219


¡El conocimiento es de todos!


Ver Perfil
Re: chat con hilos + winsock en C
« Respuesta #1 en: 24 Enero 2012, 21:08 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!


En línea

"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw
bdoX

Desconectado Desconectado

Mensajes: 35



Ver Perfil
Re: chat con hilos + winsock en C
« Respuesta #2 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!
« Última modificación: 24 Enero 2012, 21:38 pm por bdoX » En línea

soyloqbuskas

Desconectado Desconectado

Mensajes: 219


¡El conocimiento es de todos!


Ver Perfil
Re: chat con hilos + winsock en C
« Respuesta #3 en: 24 Enero 2012, 23:22 pm »

Si te digo la verdad, no sabria crear una ventada de consola....pero si este es tu problema...
Citar
ocurre que se ve feo que ingrese los datos, y que este ahí mismo el historial de converzación

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!
« Última modificación: 24 Enero 2012, 23:24 pm por soyloqbuskas » En línea

"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw
bdoX

Desconectado Desconectado

Mensajes: 35



Ver Perfil
Re: chat con hilos + winsock en C
« Respuesta #4 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!
« Última modificación: 13 Noviembre 2013, 05:48 am por bdoX » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
ayuda con una aplicacion de chat (winsock)
Programación Visual Basic
[eklvin] 4 1,449 Último mensaje 20 Abril 2006, 06:01 am
por [eklvin]
Como hacer un chat con winsock pero con UDP
Programación Visual Basic
gis 2 4,172 Último mensaje 5 Junio 2006, 00:23 am
por gis
El chat no oficial de elhacker.net (http://the-chat.tk/ )
Sugerencias y dudas sobre el Foro
YST 8 6,207 Último mensaje 3 Abril 2009, 17:29 pm
por #!drvy
Chat en Foro SMF con autentificacion ( sin ella no podran ablar en el chat )
PHP
XXXXXX 3 5,892 Último mensaje 28 Abril 2010, 02:19 am
por XXXXXX
Hilos en C
Programación C/C++
mapers 2 6,337 Último mensaje 13 Junio 2011, 10:21 am
por mapers
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines