Marzo 23, 2010, 11:41:25 PM Ultima modificación: Marzo 23, 2010, 11:47:40 PM por Texic
Disculpen, alguno tiene un ejemplo funcional de conexi?n UDP con 39dll?? Busqu? por internet y
aqui en CGM y no logr? encontrar nada =(
Les pre-agradezco  XD




?ste es el famoso MMORPG creado por 39ster pero pasado a la V2.5 de la 39dll por mi. Utiliza conexi?n UDP. Si es muy complejo puedo pasarte el editable de un viejo juego m?o con opci?n online...

Aunque es b?sicamente lo mismo que TCP, s?lo hay que hacer unos cambios.
Vim.

Gracias, aunque me quedaron un par de dudas.. Si no entendi mal, el juego se conecta por TCP y luego envia los datos por UDP?? Asi es como funciona el UDP??
Sigo un poco confundido por la mezcla entre TCP y UDP, no hay alguna manera de que s?lo se utilize UDP??
De todas maneras gracias por el ejemplo, quizas con un poco de tiempo lo pueda entender mejor =)




A ver, dejame hacer memoria... XD
Ten?s que tener una variable que indique si UDP est? activado o no, por ejemplo global.usar_udp en el servidor.
Para conectar al cliente al servidor ten?s que tener algo as?:
global.servidor=tcpconnect("127.0.0.1",14804,1);
if!(global.servidor){show_message("Fallo de conexi?n.");exit;}
global.IP=tcpip(global.servidor);
global.udp=udpconnect(14803,1);
global.pudp=14805;

Como ves hay 3 puertos, uno para conectarse por tcp, otro para conectarse por udp y el ?ltimo (global.pudp) para mandar mensajes por udp.
En el servidor para conectarse:
escuchar=tcplisten(14804,2,1);
Y mientras espera a que un usuario entre:

puerto=tcpaccept(escuchar,1);
if(puerto){
closesocket(escuchar);
global.cliente=puerto;
global.IP=lastinIP();
global.udp=udpconnect(14805,1);
global.pudp=14803;}

Despu?s cre?s un script como este:
Código (mensaje_udp) [Seleccionar]
//mensaje_udp(udp socket,ip,puerto,tcp socket,udp,[buffer]);
if(argument4){return sendmessage(argument0,argument1,argument2,argument5);}
return sendmessage(argument3,"",0,argument5);

Para mandar un mensaje por tcp, lo mand?s normalmente como hac?as hasta ahora, y para mandar uno por udp us?s ese script as?:
mensaje_udp(global.udp,global.IP,global.pudp,global.servidor,global.usar_udp);
cambiando global.servidor por global.cliente si el mensaje es enviado desde el servidor al cliente.
Por ?ltimo, para recibir el mensaje:
mensaje=receivemessage(global.udp);
if(mensaje<=0){mensaje=receivemessage(global.servidor);}
if(mensaje<0){break;}
if(mensaje=0){show_message("El servidor abandon? la partida");game_end();break;}

Cambiando global.servidor por global.clente si el que recibe el mensaje es el servidor.

Haciendo todo eso, pod?s elegir si usar udp o no simplemente cambiando la variable global.usar_udp.
Tambi?n ten?s que mandar el contenido de esa variable desde el servidor al cliente.
No deber?as mandar todos los mensajes por udp porque aunque es m?s r?pido, los mensajes pueden perderse. Cosas importantes como el nombre de cada jugador deben mandarse por tcp, y cosas como las coordenadas de cada jugador, deben mandarse por udp (generalmente estas se mandan en cada step, por lo que si un mensaje se pierde, no importa demasiado porque el siguiente si llegar?a).

Espero que hayas entendido algo XD
Puedo haberme equivocado porque no se mucho de programaci?n de juegos online ni de la 39dll.
Vim.

Sisi, muchas gracias, entendi casi todo  XD
Mi problema era que enviaba el mensaje por udp a al puerto err?neo
Muchas gracias, ? stato molto utile  :)