Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Protocolo udp, usando plugin windsock

Iniciado por ruklo, 24 de Octubre de 2008, 11:38:20 PM

« anterior - próximo »

ruklo

Buenas a todos, estamos creando un sencillo "shooter" online en darkbasic, y tenemos unos pequeños problemas con el protocolo upd por nuestra inexperiencia en estos temas, y la poca info que econtramos. Hemos consegido una conexion servidor(no dedicado)-cliente, añadiria que muy facilmente, el problema vino al incorporar a la pardia el tercer jugador, el plugin nos da un erro de una de las libreria del windsock y hay ya nos perdemos, os comento como esta planteado, haber si encontrais algun fallo, lo siguiente que probaremos sera hablar a cada cliente por un puerto, porque no se nos ocurre que puede fallar.

La pregunta es...
¿Es necesario responder a cada cliente por un puerto?
¿Escuchar y responder a cada usuario por un puerto?
En caso de ser asi...
¿Devemos recivir a los jugadores entrantes por un puerto, una vez sepamos que esten alli, asignarles un puerto, decirselo y a partir de entonces comunicarse por el puerto asignado?
¿Es necesario, escuchar y responder por distinto puerto? recomendable?
¿Esto mismo pero con canales?

P.D: Ya se, que seria mas facil hacerlo por tcp, o nativas del dark, pero buscamos velocidad, no nos importa mucho perder algun q otro paquete.

Plugin usado: http://homepage.swissonline.ch/barnski/main.htm

Prompt

Eso que dices de la velocidad es relativo. Si dark basic usa UDP, casi mejor que la uses.

No obstante repondiendo al tema. Usas un mismo puerto para todos los clientes, con cada conexion haces un hilo (con lo que acarrea) o haces pooling, es decir, vas atendiendo sus peticiones cuando tu le ordenas. Asegurate de que no abres el puerto de forma bloqueante, creo que es ese el problema que tienes.

Un saludo.

ruklo

Gracias Prompt, el problema era otro, pero esta solucionado, y funciona a la perfeccion, gracias otra vez!

Prompt

Comparta usted aqui para que quede una referencia, cual era es la solución.

Gracias!  ::)

ruklo

Con mucho gusto explico como lo hemos echo.

Cliente
Crea una canal udp
puerto remoto  xxx1
puerto entrada xxx2
envia mensaje de entrada a la ip del servidor
si no recive respuesta en x tiempo reenvia mensaje de entrada
espera respuesta por canal 1

Servidor
Crea canal udp
puerto remoto  xxx2
puerto entrada xxx1
espera respuesta por el canal 1
si recive mensaje de bienvenida, asigna la ip a un array en el puesto asignado para dicho jugador y envia al usuario su numero y mensaje de todo ok.

En resumen, con dos puertos y un canal basta para establecer la comunicacion con varios jugadores, al menos en el plugin mencionado. En cuanto al tema de la velocidad... se porta bastante bien, mejor de lo esperado la verdad.

Prompt

Holaa, varias cosas:
- El mismo puerto puede recivir y enviar. Pero bueno, puedes organizarlo como quieras.
- Si haces que por udp esperen respuestas estas simulando TCP/IP sin ordenar los paquetes. ¿Qué gracia tiene entonces utilizar UDP?

UDP solamente manda datos, sin asegurar el orden y sin confirmar respuesta. Si quieres alguna de estas 2 funcionalidades deberias usar TCP/IP que está extremadamente optimizado para estas cosas. Utiliza UDP si no te importa perder paquetes, sino usa TCP/IP. Se pueden hacer aproximaciones mixtas para sistemas en stress, pero creo no te merece la pena meterte en tal lio.

Un saludo!

ruklo

Perdona, me exprese mal, cuando decia que el server/cliente espera respuesta, quise decir que comprueba si hay un paquete.  Los paquetes los gestionamos segun lleguen sin importar el orden, el tcp/ip solo lo pensamos usar para el sistema de chat, que sera otro subprograma en otro server.

Prompt

No te puede dar igual el orden de los paquetes UDP, tienes que ponerles un ID y descartar los que no lleguen en orden o tarde.

Es decir, si mandas la posicion en el seguendo 1 y luego en el segundo 2:
- 1|0.0,0.0,0.0
- 2|0.0,0.0,-1.0

if newUDPPacket.id > oldUDPPacket.id then
    process packet message
end

Si llega el paquete 2 antes, cuando llegue el 1 lo tienes que descartar, sino el objeto volverá para atrás. Tenlo en cuenta.

Un saludo.

ruklo

En un principio no queremos complicar la cosa, el problema que nos planteas lo tuvimos en cuenta, pero le restamos importancia, ya que al llegar el dato paquete 3 su posicion volveria a ser la correcta, y presuponemos que esto pasa muy rara vez,  o mandando mas de un paquete en el mismo ciclo del programa, que no es nuestro caso.

P.D: De todos modos hare algunas pruebas, porsi tuvieras tu razon y fuese necesario. Ya os comentare.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.