Skowron1993 Opublikowano 12 Stycznia 2012 Udostępnij Opublikowano 12 Stycznia 2012 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 Więcej opcji udostępniania...
ediepl Opublikowano 12 Stycznia 2012 Udostępnij Opublikowano 12 Stycznia 2012 Udp connect przyjmuje port, a nie ip, a lastinport zwraca port tcp bodajże a nie udp. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Skowron1993 Opublikowano 12 Stycznia 2012 Autor Udostępnij Opublikowano 12 Stycznia 2012 Poprawiłem to i ciągle nie działa :| Dodam tylko że korzystam z tcp/ip, a UDP użyję tylko do przesłania pozycji. Funkcje z TCP/IP działają tak jak powinny tylko te nieszczęsne UDP się nie słuchają :| Może macie jakieś tutoriale 39dll jak używać UDP? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Jaklub Opublikowano 12 Stycznia 2012 Udostępnij Opublikowano 12 Stycznia 2012 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 Więcej opcji udostępniania...
Skowron1993 Opublikowano 12 Stycznia 2012 Autor Udostępnij Opublikowano 12 Stycznia 2012 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 Więcej opcji udostępniania...
Konrad-GM Opublikowano 12 Stycznia 2012 Udostępnij Opublikowano 12 Stycznia 2012 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 Więcej opcji udostępniania...
Skowron1993 Opublikowano 12 Stycznia 2012 Autor Udostępnij Opublikowano 12 Stycznia 2012 Mógłbyś zademonstrować na przykładzie? Trochę to dziwne :| Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Konrad-GM Opublikowano 13 Stycznia 2012 Udostępnij Opublikowano 13 Stycznia 2012 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 Więcej opcji udostępniania...
Skowron1993 Opublikowano 13 Stycznia 2012 Autor Udostępnij Opublikowano 13 Stycznia 2012 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 Więcej opcji udostępniania...
ediepl Opublikowano 13 Stycznia 2012 Udostępnij Opublikowano 13 Stycznia 2012 Założe się że robiisz to na localhost a nie możezz otworzyć dwóch socketów na tym samym porcie na jednym kompie. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 13 Stycznia 2012 Administratorzy Udostępnij Opublikowano 13 Stycznia 2012 btw. https://gmclan.org/index.php?czytajart=66&strona=2 Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
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ę