Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: anonimo12121 en 23 Abril 2010, 18:54 pm



Título: [duda] Servidor-cliente juntos? [CONSEGUIDO]
Publicado por: anonimo12121 en 23 Abril 2010, 18:54 pm
Hola.
esque estoy intentando hacer street fighter "online por asi decirlo" poco a poco conforme voy aprendiendo.
y mi problema llega aqui.

e conseguido que desde el cliente se mueva el pj en servidor.

pero ahora supongomago para hacer 1 partida de 1vs1:

PC 1 envia informacion al PC 2 . "PC 1 cliente, PC 2 servidor"
PC 2 actualiza los datos enviados del PC 1.
PC 2 envia informacion al PC1 . "PC 2 cliente , PC 1 servidor"
PC 1 actualiza los datos enviados del PC2.

...

para hacer esto deberian de ser servidor-cliente.
eso se puede hacer?
Nuevo code.
explico.
si se pone el exit(1) en el punto indicado se cierra hasta a i bien. peor el problema es que hay 1 orden antes que no la hace, que es guardar X datos en el archivo externo
Código
  1. #include <iostream>
  2. #include <fstream>
  3. #include <SDL/SDL.h>
  4. #include <SDL/SDL_image.h>
  5. #include <SDL/SDL_net.h>
  6. using namespace std;
  7. SDL_Surface *screen;
  8. SDL_Event evento;
  9. Uint8 *tecla;
  10. ////////////////////////////////////////////////////////////
  11. ofstream LOG("log.txt",ios::out);
  12. ofstream ERROR("error.txt",ios::out);
  13. ////////////////////////////////////////////////////////////
  14. IPaddress ipservidor,*ipremitente,ipcliente;
  15. TCPsocket sservidor,sremitente,scliente;
  16. ////////////////////////////////////////////////////////////
  17. ////////////////////////////////////////////////////////////
  18. char DATOS[10];
  19. int main(int argc,char *argv[]){
  20.    SDL_Init(SDL_INIT_VIDEO);
  21.    SDLNet_Init();
  22.    screen=SDL_SetVideoMode(540,480,32,SDL_SWSURFACE);
  23.    SDL_WM_SetCaption("Servidor-Cliente, By Xafi ...",0);
  24.    //servidor
  25.    SDLNet_ResolveHost(&ipservidor,0,2000);
  26.    sservidor=SDLNet_TCP_Open(&ipservidor);
  27.  
  28.    //cliente
  29.    SDLNet_ResolveHost(&ipcliente,"127.0.0.1",2000);
  30.    scliente=SDLNet_TCP_Open(&ipcliente);
  31.    //
  32.    while(1){
  33.        SDL_Delay(30);
  34.        //LOG << "\nCONEXIONES: \tServidor: " << SDLNet_Read32(&ipservidor.host) << "\tCliente: " << SDLNet_Read32(&ipremitente->host);
  35.        SDLNet_TCP_Send(scliente,"cliente conectado",512);
  36.        if(sremitente=SDLNet_TCP_Accept(sservidor)){
  37.            ERROR << "CONECTADO";
  38.            ipremitente=SDLNet_TCP_GetPeerAddress(sremitente);
  39.            while(1){
  40.                LOG << "\nCONEXION: " << SDLNet_Read32(&ipremitente->host);
  41.                //pongan la siguiente linea
  42.                //exit(1)
  43.                SDLNet_TCP_Recv(sremitente,DATOS,512);
  44.                tecla=SDL_GetKeyState(0);
  45.                SDL_PollEvent(&evento);
  46.                if(tecla[SDLK_ESCAPE])exit(1);
  47.            }
  48.        }
  49.        else ERROR << "\n" << SDLNet_GetError();
  50.    }
  51.  
  52. }
  53.  
  54.  


Título: Re: [duda] Servidor-cliente juntos?
Publicado por: Foxy Rider en 24 Abril 2010, 01:09 am
Este tema se había planteado antes (creo xD)... y la cosa depende ... depende de cuantos clientes quieras escalar ...
usando el método de cliente-servidor/PC con varias compus terminás con que el ancho de banda se dispara de forma exponencial con cada máquina que agregás ... (muchas computadoras notificándose las unas a las otras sobre updates) y salvo que implementes un buen balancing de carga, no se sostiene... salvo que se aminore usando un modelo de cliente y servidor ..

Además de que con ese balancing tirás para arriba las posibilidades de "chitear" ...   la cantidad de datos procesados en el server es inversamente proporcional a la probabilidad de hacer un cheat  ... (y directamente proporcional a la dificultad de hacerlo)

Lo importante es pensar en términos de diffs (de updates o actualizaciones) y  de compresión a nivel bit ....
también e ideal sería predicción de acciones, pero esto es opcional ....

todo lo que puedas empaquetar y que no se te vaya del rango de número de bits, empaquetalo .... y sobre todo evitá la redundancia (lo que pueda calcularse en base a otras cosas, calculalas ...), date una idea que tenés que mantener un flujo constante de información si no querés que la info se vea "rara" o cortada ... 30 updates sobre segundo aproximadamente para mantener un flujo constante ...

podés armar algo muy básico con aproximadamente 8 bytes por update ...

hay un ejercicio interesante, y es ponerse a ver todo lo que podrías o deberías transmitir en cada update (es decir el qué podés hacer para determinar cuanto tenés que enviar y cada cuanto), pasarlo a en cuanto pesaría, y multiplicarlo por la cantidad de updates por segundo ... y ahí te das cuenta del problema y prioridad "ancho de banda" (y de lo que sería plantear un buen esquema de actualizacion tanto del lado cliente y servidor)

por eso diría que no te malcríes con librerías de alto nivel para lo que es redes, salvo que te den flexibilidad de hacer cosas de bajo nivel (esto te lo digo por si las dudas, nunca miré ni de lejos SDL_Net, es mandar fruta para tu caso, ví otras y no me gustaron ... pero por si aplica, siempre usé mis propias clases basadas en sockets a pelo por que te permite esbozar bien lo que querés y como querés mandarlo)


Saludos.


Título: Re: [duda] Servidor-cliente juntos?
Publicado por: anonimo12121 en 24 Abril 2010, 11:54 am
vertex@Symphony gracias por lo que me has dicho lo tendre en cuenta.
pero no soy experto como para hacerme 1 libreria de sockets, ni mucho menos si, ni siquiera ser usar SDLNet, que la veo muy facil pero el problema es que se me cuelga si hago 2 llamadas a

socket_s=SDLNet_TCP_Open(&ip_s); // esta para recivir
socket_c=SDLNet_TCP_Open(&ip_c);// esta para mandar
XS


Título: Re: [duda] Servidor-cliente juntos?
Publicado por: anonimo12121 en 26 Abril 2010, 23:05 pm
actualizado. ayudenme por favor


Título: Re: [duda] Servidor-cliente juntos? [CONSEGUIDO]
Publicado por: anonimo12121 en 28 Abril 2010, 12:39 pm
Bueno la idea me vino mientras miraba mis plantas de mariahachis XD.


aqui esta el code. con alto indice de fallos y errores e conseguid conectar .
creo que se cuales son los fallos intentare arreglarlo.
pero lo principal que e conseguido hacer servidor-cliente.

Código
  1. #include <iostream>
  2. #include <fstream>
  3. #include <SDL/SDL.h>
  4. #include <SDL/SDL_image.h>
  5. #include <SDL/SDL_net.h>
  6. using namespace std;
  7. SDL_Surface *screen;
  8. SDL_Event evento;
  9. Uint8 *tecla;
  10. ////////////////////////////////////////////////////////////
  11. ofstream LOG("log.txt",ios::out);
  12. ofstream ERROR("error.txt");
  13. ////////////////////////////////////////////////////////////
  14. IPaddress ipservidor,*ipremitente,ipcliente;
  15. TCPsocket sservidor,sremitente,scliente;
  16. int opcion=0;
  17. int cl=0;
  18. ////////////////////////////////////////////////////////////
  19. ////////////////////////////////////////////////////////////
  20. char DATOS[512];
  21. int main(int argc,char *argv[]){
  22.    SDL_Init(SDL_INIT_VIDEO);
  23.    SDLNet_Init();
  24.    screen=SDL_SetVideoMode(540,480,32,SDL_SWSURFACE);
  25.    SDL_WM_SetCaption("Servidor-Cliente, By Xafi ...",0);
  26.    //servidor
  27.    SDLNet_ResolveHost(&ipservidor,0,2000);
  28.    //sservidor=SDLNet_TCP_Open(&ipservidor);
  29.    //cliente
  30.    SDLNet_ResolveHost(&ipcliente,"127.0.0.1",2000);
  31.    //scliente=SDLNet_TCP_Open(&ipcliente);
  32.    while(1){
  33.        SDL_Delay(30);
  34.        tecla=SDL_GetKeyState(0);
  35.        SDL_PollEvent(&evento);
  36.        if(tecla[SDLK_ESCAPE])exit(1);
  37.        if(opcion==0){
  38.            if(tecla[SDLK_s]){
  39.                opcion=1;
  40.                cl=1;
  41.  
  42.            }
  43.            if(tecla[SDLK_c]){
  44.                opcion=2;
  45.                cl=2;
  46.  
  47.            }
  48.        }
  49.        //sservidor=SDLNet_TCP_Open(&ipservidor);
  50.        if(opcion==1){
  51.            if(cl==2 || cl==3)SDLNet_TCP_Close(scliente);
  52.            sservidor=SDLNet_TCP_Open(&ipservidor);
  53.            LOG << "\nCONEXIONES: \tServidor: " << SDLNet_Read32(&ipservidor.host);
  54.            while(1){
  55.                if(sremitente=SDLNet_TCP_Accept(sservidor)){
  56.                    ERROR << "CONECTADO";
  57.                    ipremitente=SDLNet_TCP_GetPeerAddress(sremitente);
  58.                    LOG << "\nCONEXION: " << SDLNet_Read32(&ipremitente->host);
  59.                    SDLNet_TCP_Recv(sremitente,DATOS,512);
  60.                    break;
  61.                }
  62.            }
  63.            opcion=2;
  64.            cl=3;
  65.        }
  66.        if(opcion==2){
  67.            if(cl==1 || cl==3)SDLNet_TCP_Close(sservidor);
  68.            scliente=SDLNet_TCP_Open(&ipcliente);
  69.            SDLNet_TCP_Send(scliente,"datos",512);
  70.            SDLNet_TCP_Close(scliente);
  71.            opcion=1;
  72.            cl=3;
  73.        }
  74.    }
  75.  
  76. }
  77.  
  78.