Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Buen Tuto De Sockets?

Iniciado por Helius, 14 de Agosto de 2003, 07:58:08 PM

« anterior - próximo »

Helius

 Pues eso...

si alguien sabe algun tutorial sobre sockets en c++ que este bien, completito y no importa si esta en ingles  :D

saluos
Geardome Devlog
Tutoriales sobre DirectX 9, Nintendo DS y PSP.

CoLSoN2

 en flipcode.com/network creo que habia una serie de tutos sobre el tema.. no recuerdo la URL exacta (ZeruGiran, yo te invoco!), pero ZeruGiran me dijo ayer la dirección donde tiene colgada una libreria de sockets (SolarSocket, si no recuerdo mal) de alto nivel que ha hecho para War3d y que es de código abierto. Busca por ese nombre en google a ver que sale.
Manuel F. Lara
Descargar juegos indie  - blog sobre juegos indie y casual
El Desarrollo Personal.com  - blog sobre productividad, motivación y espíritu emprendedor

ZeruGiran

 Aun en construccion, funciona 100% para linux, pero para Windows estamos reestructurando un poco, para poder usar threads nativamente. De hecho ya funciona :P pero aun no atualizo la pagina, porque quiero hacer una pruebas antes.

War3D ya esta usando esta libreria en Linux y Windows.



SolarSockets C++

Saludos

Astharoth

 Bueno....

En este caso yo aparte de las consabidas ayudas de las paginas de man o bien msdn, recomiendo la practica.

Nada mejor que pillar algun ejemplo (segun lo que uno busque... tcp, udp, cliente / servidor,etc), montarse dos equipos con cable cruzado y un par de ethernet's e ir probando.

Asi se aprende mucho :D

Por otra parte, como digo, depende de la orientacion y de lo que se quiera obtener de red.. si es solo para tema de enviar variables de estado de un player para multiplayer en red (rollito udp) o transmitir mas cosas (rollito tcp...) como podrian ser capturas de webcam, envio de geometrias, texturas,etc

Pero vamos, nada como poner los dos equipos y probar (si uno es con linux y otro con win mejor, asi se controlan ambas api's).

Saludos, Astharoth.

PD: En Win funciona perfectamente las llamadas de linux excepto algunos IOCTL's de bajo nivel.. solo que win tambien tiene las funciones renombradas como WSA.. algo.

PD2: ZeruGiran, si teneis algun problema con ese API en Win32/Linux de tema compatibilidad, dejame un mail o mensaje.. por curro he tenido que hacer movidas de esas y llevo ya algo de adelanto :D


ethernet

 Yo te recomendaria un vistazo a la beej guide  - http://www.ecst.csuchico.edu/~beej/guide/net/ buscala en google, esta en español tb-, habla de sockets BSD, que como bien te han dicho se programan de manera muy similar en windows y en otros SO como linux,unix etc. Otra pagina interesante es la FAQ de winsock - http://tangentsoft.net/wskfaq/ - que viene informacion muy interesante.

Por otra parte para encapsularlo en c++ te recomiendo mirar como lo hace java en sus sockets - http://www.google.com/search?q=java+socket...%3Ajava.sun.com -

Otros detalles:

Los sockets en windows NO SE PARECEN ni en lo blanco de los ojos a los de BSD, ni se deben programar igual y winsock tiene unas funciones exclusivas para enviar, recibir, conectar etc,.

En el codigo de la semana hace unos meses puse mi libreria de sockets en c++, quizas te guste

saludos




ethernet

 Zeru unas cosas de tu libreria:

-En tu clase socket veo q siempre envias cadenas de texto, no te parece un poco particular?
-por que no usas herencia virtual envez de punteros a funciones?
-solo puedes recibir 50 bytes de una vez?
-No tiene codigo fuente abierto?
-Lo usareis para war3d ?

saludos

ethernet

 Yo estoy trabajando en una clase de sockets y tal, quizas te interese algo, aqui pego un ejemplo de su uso. pattern serialize rocks:



struct foo: public Serializable
{

   std::string Name;
   std::string Age;
   std::string Power;
   int         Live;

   virtual void Serialize(TData &d)
   {
       d << Name << Age << Power << Live;
   }
   void Print()
   {
       printf("\n---------Player-----------\nName: %s\n",Name.c_str());
       printf("AGe: %s\n",Age.c_str());
       printf("Power: %s\n",Power.c_str());
       printf("Live: %i\n",Live);
   }

};


// -- main

   bool cliente = true;
   const char msg[] ="holax";
   IP local("localhost:1235");

   if(local.OK())
           printf("host: %s\nPort: %d",local.StrIp(),local.port());
   else
           printf("fallo");


   UDPSock s;

   s.start(local);
   if(cliente)
   {

        BufferArchive Ar;
       
        foo Player;

        Player.Name = "javi";
        Player.Age = "21";
        Player.Power = "magic";
        Player.Live = 100;

        //envio 5 veces el mismo jugador
        Ar << Player << Player << Player << Player << Player;
       
        s << Packet(Ar,local);
       

   }
   else
   {   int rep = 5;
       char b[1024];
       //Packet p;
       if( !s.Bind(local))
       {
           printf("Error:: Bind, errcode: %d\n", Net::Error().ErrCode());
           return;
       }
       
       while(rep--)
       {      
           Packet p = GetPacket(s);
           if(Net::Error())
           {
               printf("problemas");
           }
           std::string s;
           foo Player;
            //recibimos jugadores
           while(!p.AtEnd())
           {
               p << Player;
               Player.Print();

           }
           

           printf("Dir:\n\tHost: %s \n\tPort: %d\n",p.Dir.StrIp(),p.Dir.port());
       }
       printf("Error::  errcode: %d\n", Net::Error().ErrCode());
   }

Zaelsius

 Mola! a ver cuando cuelgas la clase completa por aquí  ;)  

ethernet

 umh, ya colgare la clase cuando tenga todo terminado. Se supone que eso es la capa inferior, edspues hay otra que controla las conexiones, pero estoy teniendo problemas con el diseño, nunca quedo lo suficiente agusto XDDD.

ZeruGiran

 Hola: B)

Astharoth:
CitarPD2: ZeruGiran, si teneis algun problema con ese API en Win32/Linux de tema compatibilidad, dejame un mail o mensaje.. por curro he tenido que hacer movidas de esas y llevo ya algo de adelanto

No es problema :) estoy acustumbrado a escribir codigo para las dos plataformas.

ethernet:

Citar
1- En tu clase socket veo q siempre envias cadenas de texto, no te parece un poco particular?
2- por que no usas herencia virtual envez de punteros a funciones?
3- solo puedes recibir 50 bytes de una vez?
4- No tiene codigo fuente abierto?
5- Lo usareis para war3d ?

1.- Sip hasta ahora solo strings, pero pasa que por el momento es lo unico que necesito para el War. Pero Si vamos a poner soporte para enviar en modo binario.

2.- He estado mirando como los hacen el CallBack otras librerias, y la mayoria usan Herencia virtual, asi que sip, tendre que hacerlo asi tambien. Conservare las dos interfaces, una con punteros a fucniones y las otra con herencia.

3.- Nop, si se puede enviar mas de 50. Ese 50 que esta en el codigo no es para nada :P olvide borrarlo, pasa que estaba haciendo pruebas.

4.- Por ahora el codigo no esta disponible. Sin embargo el uso de la libreria, cuando este terminada, sera Libre para proyectos sin animo de lucro.

5.- War3D ya esta usando la libreria. De hecho hace unos pocos dias jugamos Jove y Yo la primera partida Multiplayer :), ya pronto publicaremos un nuevo Demo con lo que tenemos hasta ahora. El codigo fuente esta en nuestro CVS por si alguno quieres bajar las fuentes y miraro antes de que lancemos el Demo.

CVS -> War3D Source

Ahora estamos trabajando para que la libreria este a punto, para poder usarse en el War3D, pero poco a poco pondremos cosas mas generales, por ejemplo en envio de bytes (modo binario) y la sobrecarga de los operadores >> y << portarla a BSD y posiblemente a Mac

Ya les cuanto cuando este online la nueva version de la libreria (Mañana o pasado mañana). A ver que les parece y si hay mas sugerencias.

Helius:

Aqui hay una pagina de Sockets exelete, es la que mas me ha ayudado. Nota: Es para Linux, pero solo hay que hacer unos pocos cambios para que rule en Ventanucos.

http://www.iespana.es/masev/gpr/index.html






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.