Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Duda de sockets en C

Estas en el tema de Duda de sockets en C en el foro de C/C++ en Foros del Web. Hola, soy nuevo y quería preguntar una duda que tengo acerca de los sockets en C: ¿Los sockets permiten conectar dos ordenadores cualquiera, o tienen ...
  #1 (permalink)  
Antiguo 15/12/2012, 09:27
 
Fecha de Ingreso: diciembre-2012
Mensajes: 13
Antigüedad: 11 años, 4 meses
Puntos: 0
Duda de sockets en C

Hola, soy nuevo y quería preguntar una duda que tengo acerca de los sockets en C:

¿Los sockets permiten conectar dos ordenadores cualquiera, o tienen que ser de la misma subred?

Es que estoy trabajando en un programa servidor y cliente, y cuando los lanzo en la misma subred funcionan, pero cuando lanzo el servidor en un ordenador y el cliente en otro de otra red, no funciona.

Gracias!
  #2 (permalink)  
Antiguo 15/12/2012, 10:31
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Duda de sockets en C

Las IP estan por niveles; un servidor dentro de una LAN es accesible (por defecto) por los demas clientes de esa misma LAN. Cuando abres el puerto de tu router para acceso remoto (port forwarding) la IP de tu servidor para los que se conectan desde fuera no es la misma que la que tienes dentro de la LAN, sino que es la que tiene tu router (la targeta de red de tu maquina tiene una IP, tu router tiene otra, etc)

Puedes encontrar por ahi varias paginas que te 'dicen' la IP que tienes por fuera (es decir la que te asigna tu ISP), y es esa a la que debe conectarse el cliente.

Saludos
vosk
  #3 (permalink)  
Antiguo 15/12/2012, 11:30
 
Fecha de Ingreso: diciembre-2012
Mensajes: 13
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Duda de sockets en C

Vamos, que si funciona el código aunque sea en LAN, el socket está bien ¿no? solo tendría que cambiar IP
  #4 (permalink)  
Antiguo 15/12/2012, 14:31
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Duda de sockets en C

Hasta donde yo se si
  #5 (permalink)  
Antiguo 15/12/2012, 15:31
 
Fecha de Ingreso: diciembre-2012
Mensajes: 13
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Duda de sockets en C

Valee ¡¡muchas gracias!!

Otra duda que tengo, a ver si alguien puede ayudarme:

Tengo un programa servidor-cliente de sockets en UDP y para un cliente me funciona bien, pero con más clientes, digamos que el servidor comparte el socket con todos los clientes.

¿Cómo podría hacer para que cada cliente tuviera un socket con el servidor? He intentado con la función select() pero no he obtenido el resultado esperado...

Gracias de antemano

Última edición por diegons_92; 15/12/2012 a las 15:37
  #6 (permalink)  
Antiguo 15/12/2012, 16:07
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Duda de sockets en C

Hay dos formas de hacerlo, con multiples procesos o con forks.

Si quieres hacerlo con multiples procesos cada vez que aceptas un cliente generas una estructura de datos dinamicamente para ese cliente y abres un proceso con esos datos, el socket de servicio lo estaras reutilizando y el nuevo socket aceptado lo envias al proceso, de esta forma el socket cliente se manipulará desde el proceso y el socket de servicio solo estará bloqueado en el momento del accept. El proceso solo necesita el nuevo socket cliente para tramitar datos, de forma que el servidor queda libre. El proceso se encargará de ejecutar la peticion y liberar la memoria usada por la estructura de datos. Mientras estas procesando la peticion de un cliente puedes aceptar el siguiente y lanzar otro proceso paralelo, y asi con todos los clientes.

Si por el contrario quieres usar forks, la cosa depende de si estas en windows o en otro s.o.; los Berkeley sockets definen una funcion fork o select (o algo asi) que en windows se traduce a WSAAsyncSelect. Personalmente solo he usado sockets bajo windows, por lo que desconozco el funcionamiento en unix. Para el modelo asincrono de windows solo tienes que esperar que la aplicacion reciba unos determinados mensajes (FD_ACCEPT, FD_READ, FD_WRITE, etc) y responder de forma apropiada. Antes que nada deberas tener una lista donde guardaras los datos de los clientes; esta lista será de structs igual que con los multiprocesos, pero en vez de ejecutar las peticiones de forma simultanea, se ejecutaran segun el orden de mensaje que recibes (p.ej. recibes FD_WRITE con un indice de socket, buscas el socket en la lista y envias x bytes al cliente)

Creo que en algun sitio lei que el modelo multiproceso no es recomendable, pero no se. Seguramente encontraras algun manual por ahi, en la guia beej tienes un ejemplo de Synchronous I/O Multiplexing para Unix

Saludos
vosk

Etiquetas: funcion, programa, sockets
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:21.