Pues eso...
si alguien sabe algun tutorial sobre sockets en c++ que este bien, completito y no importa si esta en ingles :D
saluos
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.
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.
(http://solarirc.sourceforge.net/solarsockets/Logo_01.png)
SolarSockets C++Saludos
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
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
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
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());
}
Mola! a ver cuando cuelgas la clase completa por aquí ;)
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.
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 SourceAhora 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