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

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Chat c++ sockets windows duda
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Chat c++ sockets windows duda  (Leído 3,821 veces)
patilanz


Desconectado Desconectado

Mensajes: 481

555-555-0199@example.com


Ver Perfil WWW
Chat c++ sockets windows duda
« en: 5 Mayo 2014, 21:09 pm »

Hola recién empiezo con los sockets y solo en windows y quiero intentar a hacer un chat pero tengo 2 problemas.
Quiero que el chat funcione con un server al que llegan mensajes de varios usuarios y luego el server envie el mensaje para su destino. Pero el problema aquí son los usuarios ya que cuando acepta un mensaje para de aceptar mas. No se como hacer lo multiarea.

Luego el otro problema es que quiero que los mensajes al cliente van llegando pero a su vez este pueda escribir cuando quiera de modo que al aceptar los mensajes del servidor no influya a funciones para coger teclas del teclado, necesito que sean dos procesos distintos.

Alguien me puede ayudar con algun tutorial o ayuda pls  :D


En línea

x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: Chat c++ sockets windows duda
« Respuesta #1 en: 6 Mayo 2014, 06:21 am »

Hola recién empiezo con los sockets y solo en windows y quiero intentar a hacer un chat pero tengo 2 problemas.
Quiero que el chat funcione con un server al que llegan mensajes de varios usuarios y luego el server envie el mensaje para su destino. Pero el problema aquí son los usuarios ya que cuando acepta un mensaje para de aceptar mas. No se como hacer lo multiarea.

Luego el otro problema es que quiero que los mensajes al cliente van llegando pero a su vez este pueda escribir cuando quiera de modo que al aceptar los mensajes del servidor no influya a funciones para coger teclas del teclado, necesito que sean dos procesos distintos.

Alguien me puede ayudar con algun tutorial o ayuda pls  :D
Yo no entendí como tienes pensado que los programas/Usuarios funcionarian junto con el server.
Pero ¿cual es el problema? cómo crear aplicaciónes multitarea o cómo es la estructura en general de los programas multitarea?




En línea

patilanz


Desconectado Desconectado

Mensajes: 481

555-555-0199@example.com


Ver Perfil WWW
Re: Chat c++ sockets windows duda
« Respuesta #2 en: 6 Mayo 2014, 07:21 am »

Yo creo que necesito aprender como funcionan y se crean las aplicaciones multiarea para crear el chat pero no estoy seguro.En estos dos casos es necesario o se puede hacer de otra forma? :

1 - El programa cliente al empezar pide un nombre de usuario que envía hasta el server, hasta aquí bien. Luego tiene que empezar a escuchar al server los mensajes entrantes y poder cambiar el texto en la consola pero a su vez tiene que poder escuchar lo que escribe el usuario pero conjuntamente se bloquean.

2 - El server solo puede atender a un usuario a la vez como lo hago para que atienda a mas?

Ahora me he explicado bien así?
En línea

x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: Chat c++ sockets windows duda
« Respuesta #3 en: 6 Mayo 2014, 08:05 am »

Yo creo que necesito aprender como funcionan y se crean las aplicaciones multiarea para crear el chat pero no estoy seguro.En estos dos casos es necesario o se puede hacer de otra forma? :
Más bien depende del diseño de tu aplicación. Te puedo recomendar este libro buena introducción con ejemplos, explica como crear aplicaciones multihilos.
En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Chat c++ sockets windows duda
« Respuesta #4 en: 6 Mayo 2014, 08:27 am »

Lo que sucede, creo yo, es que estás definiendo las conexiones como bloqueantes. Al ser una conexión bloqueante, si tu código llama a la función recv o recvfrom el hilo se quedará congelado dentro de la función hasta que recibas algo.

Para solucionar esto tienes dos opciones:

* Hacer la aplicación multihilo y crear un hilo nuevo para cada cliente.

* Hacer las conexiones no bloqueantes.

Yo te voy a comentar brevemente la segunda solución, para la primera el hecho de trabajar con sockets es casi irrelevante.

Para definir una conexión como no bloqueante tienes que hacer uso de la función fcntl, cuyo prototipo aparece a continuación:

Código
  1. #include <fcntl.h>
  2.  
  3. int fcntl(int fd, int cmd, int arg );

El primer parámetro es el descriptor ( un socket, un archivo... lo que corresponda. En tu caso el socket ).
El segundo parámetro permite indicar el sentido de la operación, lectura o escritura.
El tercer parámetro se usa en la escritura y permite modificar ciertos parámetros del desriptor.

En nuestro caso concreto, queremos hacer una operación de escritura ( vamos, modificar el comportamiento del descriptor ) y lo que queremos modificar es el comportamiento bloqueante.

Esto se consigue con la siguiente línea:

Código
  1. if ( fcntl( socket, F_SETFL, O_NONBLOCK ) < 0 )
  2. {
  3.  // error
  4. }

Una vez configurado el socket, si intentas realizar una operación de lectura y no hay datos para leer, el hilo de ejecución no se quedará esperando datos, sino que saldrá de la función indicándote que no ha leído absolutamente nada.

Esta circunstancia la puedes controlar así:

Código
  1. int data_length = recv ( socket, buffer, LENGTH_BUFFER, 0 );
  2.  
  3. if ( data_length > 0 )
  4. {
  5.  // Se han recibido datos
  6. }
  7. else if ( data_length == 0 )
  8. {
  9.  // No hay datos pendientes
  10. }
  11. else if ( data_length == SOCKET_ERROR )
  12. {
  13.  // Error
  14. }
En línea

x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: Chat c++ sockets windows duda
« Respuesta #5 en: 6 Mayo 2014, 08:35 am »

@eferion: Windows, Windows...
En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Chat c++ sockets windows duda
« Respuesta #6 en: 6 Mayo 2014, 08:36 am »

--
« Última modificación: 6 Mayo 2014, 08:38 am por eferion » En línea

x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: Chat c++ sockets windows duda
« Respuesta #7 en: 6 Mayo 2014, 08:40 am »

Lo se... pero patilanz ha dicho que está en Windows
precisamente. ¿Configurando sockets con fcntl en Windows?
En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Chat c++ sockets windows duda
« Respuesta #8 en: 6 Mayo 2014, 08:45 am »

La verdad es que hace como 6 años que no toco mucho el tema de sockets al nivel de conexiones concurrentes... pero creo recordar que el mecanismo era el mismo... voy a revisar un poco el tema por si estoy equivocado.

Cierto, estaba equivocado:

Código
  1. #include <winsock2.h>
  2. #include <stdio.h>
  3.  
  4. #pragma comment(lib, "Ws2_32.lib")
  5.  
  6. void main()
  7. {
  8. //-------------------------
  9. // Initialize Winsock
  10. WSADATA wsaData;
  11. int iResult;
  12. u_long iMode = 0;
  13.  
  14. iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
  15. if (iResult != NO_ERROR)
  16.  printf("Error at WSAStartup()\n");
  17.  
  18. //-------------------------
  19. // Create a SOCKET object.
  20. SOCKET m_socket;
  21. m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  22. if (m_socket == INVALID_SOCKET) {
  23.  printf("Error at socket(): %ld\n", WSAGetLastError());
  24.  WSACleanup();
  25.  return;
  26. }
  27.  
  28. //-------------------------
  29. // Set the socket I/O mode: In this case FIONBIO
  30. // enables or disables the blocking mode for the
  31. // socket based on the numerical value of iMode.
  32. // If iMode = 0, blocking is enabled;
  33. // If iMode != 0, non-blocking mode is enabled.
  34.  
  35. iResult = ioctlsocket(m_socket, FIONBIO, &iMode);
  36. if (iResult != NO_ERROR)
  37.  printf("ioctlsocket failed with error: %ld\n", iResult);
  38.  
  39.  
  40. }

Código sacado de http://msdn.microsoft.com/en-us/library/windows/desktop/ms738573(v=vs.85).aspx
« Última modificación: 6 Mayo 2014, 08:47 am por eferion » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Creacion de Chat con sockets y mas de un cliente
Programación Visual Basic
Banchan 3 4,815 Último mensaje 7 Julio 2008, 02:00 am
por Banchan
Chat en Java [Sockets]
Java
Debci 2 12,617 Último mensaje 27 Agosto 2009, 19:26 pm
por egyware
Haciendo un chat por sockets
Programación C/C++
ipmicrobious 1 2,210 Último mensaje 3 Diciembre 2016, 16:03 pm
por ivancea96
Chat en Java con Sockets
Java
Elliot123 1 2,365 Último mensaje 3 Mayo 2018, 17:30 pm
por srWhiteSkull
Problemas con el scroll de mi chat en jquery y sockets
Desarrollo Web
Ali Baba 0 1,836 Último mensaje 27 Julio 2018, 03:48 am
por Ali Baba
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines