Skocz do zawartości

UDP 39dll


Skowron1993

Rekomendowane odpowiedzi

Witam. Usiłuję wtoczyć do swojej aplikacji protokół UDP, jednak do clienta nie dochodzą żadne dane( od servera ), a powinny.

 

Przy dołączaniu clienta mam kod:

GML
NowyClient = tcpaccept( global.ServerSocket, true );

if( NowyClient > 0 )

{

global.ServerIloscGraczy += 1;

global.ServerClient[ global.ServerIloscGraczy ] = NowyClient;

global.ServerClientUdp[ global.ServerIloscGraczy ] = udpconnect( global.ServerPort, true);

global.ServerClientIP[ global.ServerIloscGraczy ] = lastinIP();

global.ServerClientPort[ global.ServerIloscGraczy ] = lastinPort();

//...</span>

W step servera:

GML
r = receivemessage( global.ServerClientUdp[ i ] );

if( r > 0 )

{

xxx = 1;

k = readdouble();

if( k == 200 )

{

// repozycja

posX = readdouble( );

posY = readdouble( );

for( o1 = 1; o1 <= global.ServerIloscGraczy; o1 += 1 )

{

if( o1 != i )// <- po co wysylac id obiektowi ktore je nadeslal...

{

clearbuffer( );

writedouble( 200 );

writedouble( i );

writedouble( posX );

writedouble( posY );

sendmessage( global.ServerClientUdp[ i ], global.ServerClientIP[ i ], global.ServerClientPort[ i ] );// UDP!!!

}

}

}

}

 

no i client:

create:

GML
global.ClientServerSocket = tcpconnect( global.ClientServerIP, global.ClientServerPort, true );

if( global.ClientServerSocket <= 0 ) return false;

else

{

global.ClientServerUdp = udpconnect( global.ClientServerIP, true );

global.ClientServerUdpIP = tcpip( global.ClientServerSocket );

return true;

}

step:

GML
r = receivemessage( global.ClientServerUdp );

if( r > 0 )

{

k = readdouble( );

show_message( k );

if( k == 200 )

{

id_obj = readdouble( );

for( o = 0; o < instance_count; o += 1)

{

obj = instance_id[ o ];

if( instance_exists( InnyClient ) )

{

if( obj.object_index == InnyClient.object_index )

{

if( obj.MojeID == id_obj )

{

obj.x = readdouble( );

obj.y = readdouble( );

}

}

}

}

}

}

 

Do servera na 100% wysyła wiadomość, tylko nie wiem czy może coś z wysyłaniem źle czy odbieraniem?

Odnośnik do komentarza
Udostępnij na innych stronach

jeśli dokładnie przeczytasz to, co jest w załączonym do 39dll pliku, wystarczy ci to. ja tak zrobiłem i dałem sobie radę.

 

porada: użyj udpconnect raz, nie za każdym razem gdy ktoś do ciebie dołącza.

Odnośnik do komentarza
Udostępnij na innych stronach

Nie wiem już co jest tutaj źle :|

 

Tworze server:

GML
global.ServerClientUdp = udpconnect( global.ServerPortUdp, true);

 

Dołączam do niego:

GML
global.ClientServerUdp = udpconnect( global.ClientServerPortUdp, true );

 

Wysyłam mu nową pozycje( Client ):

GML
if( x != xprevious || y != yprevious )

{

clearbuffer( );

writedouble( 200 );

writedouble( global.ClientMojeID );

writedouble( x );

writedouble( y );

sendmessage( global.ClientServerUdp, global.ClientServerPortUdp, global.ClientServerUdpIP );// UDP!!!

xprevious = x;

yprevious = y;

}

 

Odbieram i przesyłam pozostałym( Server ):

GML
r = receivemessage( global.ServerClientUdp );

if( r > 0 )

{

k = readdouble();

instance_create( 10, 10, oxx );

if( k == 200 )

{

// repozycja

id_typka = readdouble( );

posX = readdouble( );

posY = readdouble( );

for( YY = 1; YY <= global.ServerIloscGraczy; YY += 1 )

{

clearbuffer( );

writedouble( 200 );

writedouble( id_typka );

writedouble( posX );

writedouble( posY );

sendmessage( global.ServerClientUdp, global.ServerClientIP[ YY ], global.ServerClientPortUdp );// UDP!!!

}

}

}

 

Na koniec cała reszta clientów odbiera naszą pozycje( Client ):

GML
r = receivemessage( global.ClientServerUdp );

if( r > 0 )

{

show_message( "cos tam doszlo" );

k = readdouble( );

if( k == 200 )

{

id_do_zmiany = readdouble( );

idx = readdouble( );

idy = readdouble( );

show_message( id_do_zmiany );

show_message( idx );

show_message( idy );

for( o = 0; o < instance_count; o += 1)

{

obj = instance_id[ o ];

if( instance_exists( InnyClient ) )

{

if( obj.object_index == InnyClient.object_index )

{

if( obj.MojeID == id_do_zmiany )

{

obj.x = idx;

obj.y = idy;

}

}

}

}

}

}

 

Niestety nie działa :| Nie tworzy się nawet obiekt oxxx, co oznacza że server nie dostał wiadomości :/

Odnośnik do komentarza
Udostępnij na innych stronach

Wyobraź sobie, iż gniazda UPD działają jak strumienie. Na serwerze otwierasz tylko 2 gniazda - wejścia & wyjścia. Z pierwszego gniazda wyczytujesz dane, które przesyłają Ci klienci. Natomiast przez drugie gniazdo wysyłasz dane klientom (Podając IP, do którego). Od klienta strony należy otworzyć również (W tym wypadku) 2 gniazda - wejścia & wyjścia, pierwsze gniazdo ma wysyłać dane do serwera (Taki sam port, co serwer sobie zarezerwował dla 1st gniazda - odbierającego), drugie natomiast odbierać ( Taki sam port, co serwera - ale dla gniazda rozsyłającego ).

Odnośnik do komentarza
Udostępnij na innych stronach

Nie mam aktualnie zainstalowanego GMa, ale to bardzo prosta rzecz:

 

Server:

GML (Create)
global.udpPortIn = 2401;

global.udpPortOut = 2402;

 

global.updSocketIn = udpconnect( global.udpPortIn, true ); // readable

global.updSocketOut = udpconnect( global.udpPortOut, true ); // writeable</span>

 

GML (SendMessage)
clearbuffer();

... // Some data to send

sendmessage( global.updSocketOut, global.clientIP[n], global.udpPortOut );

 

GML (ReceiveMessage)
recv = receivemessage( global.updSocketIn );

...

 

Client:

GML (Create)
global.udpPortIn = 2402; // Same as server's out port used by socket

global.udpPortOut = 2401; // Same as server's in port used by socket

global.updSocketIn = udpconnect( global.udpPortIn, true ); // readable

global.updSocketOut = udpconnect( global.udpPortOut, true ); // writeable</span>

 

GML (SendMessage)
clearbuffer();

... // Some data to send

sendmessage( global.updSocketOut, global.serverIP, global.udpPortOut );

 

GML (ReceiveMessage)
recv = receivemessage( global.updSocketIn );

...

Odnośnik do komentarza
Udostępnij na innych stronach

Dzieki wielkie, zaraz sprawdzę :)

 

EDIT: No i ja już nie wiem -.- Zrobiłem( na 99%, zaraz 4 rano ) tak jak to opisałeś i nie działa :/

GML
// Create:

global.ServerSocketIn = udpconnect( global.ServerPortIn, true);// 2060

global.ServerSocketOut = udpconnect( global.ServerPortOut, true);// 2070

// Odbieranie( step ):

r = receivemessage( global.ServerSocketIn );

global.ServerOdebrane = r;

if( r > 0 )

{

k = readdouble();

instance_create( 10, 10, oxx );

//... obiekt sie wcale nie tworzy wiec dane nie dochodza</span>

 

Client:

GML
// Create

global.ClientServerIn = udpconnect( global.ClientServerPortIn, true );

global.ClientServerOut = udpconnect( global.ClientServerPortOut, true );

 

// Wysyłanie( server tego nie odbiera )

if( x != xprevious || y != yprevious )

{

clearbuffer( );

writedouble( 200 );

writedouble( global.ClientMojeID );

writedouble( x );

writedouble( y );

sendmessage( global.ClientServerOut, global.ClientServerIP, global.ClientServerPortOut );// UDP!!!

xprevious = x;

yprevious = y;

}

 

Zero reakcji :|

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...