› Foros › Multiplataforma › Desarrollo
bool g_NetInit = false;
bool g_NetAdhocInit = false;
bool g_NetAdhocctlInit = false;
bool g_NetAdhocctlConnect = false;
bool g_NetAdhocPdpCreate = false;
bool g_NetAdhocMatchingInit = false;
bool g_NetAdhocMatchingCreate = false;
bool g_NetAdhocMatchingStart = false;
int adhocInit(char *MatchingData)
{
char mac[6];
struct productStruct product;
ClearPspList();
strcpy(product.product, "ULUS99999");
product.unknown = 0;
u32 err;
printf("sceNetInit()\n");
err = sceNetInit(0x20000, 0x20, 0x1000, 0x20, 0x1000);
if (err != 0)
return err;
g_NetInit = true;
printf("sceNetAdhocInit()\n");
err = sceNetAdhocInit();
if (err != 0)
return err;
g_NetAdhocInit = true;
printf("sceNetAdhocctlInit()\n");
err = sceNetAdhocctlInit(0x2000, 0x20, &product);
if (err != 0)
return err;
g_NetAdhocctlInit = true;
// Connect
err = sceNetAdhocctlConnect("");
if (err != 0)
return err;
g_NetAdhocctlConnect = true;
int stateLast = -1;
printf("Connecting...\n");
while (1)
{
int state;
err = sceNetAdhocctlGetState(&state);
if (err != 0)
{
printf("sceNetApctlGetState returns $%x\n", err);
sceKernelDelayThread(10*1000000); // 10sec to read before exit
return -1;
}
if (state > stateLast)
{
printf(" connection state %d of 1\n", state);
stateLast = state;
}
if (state == 1)
break; // connected
// wait a little before polling again
sceKernelDelayThread(50*1000); // 50ms
}
printf("Connected!\n");
sceWlanGetEtherAddr(mac);
printf("sceNetAdhocPdpCreate\n");
pdpId = sceNetAdhocPdpCreate(mac,
0x309, // 0x309 in lumines
0x400, // 0x400 in lumines
0); // 0 in lumines
if(pdpId <= 0)
{
printf("pdpId = %x\n", pdpId);
return -1;
}
g_NetAdhocPdpCreate = true;
printf("sceNetAdhocMatchingInit()\n");
err = sceNetAdhocMatchingInit(0x20000);
if(err != 0)
{
printf("error = %x\n", err);
}
g_NetAdhocMatchingInit = true;
printf("sceNetAdhocMatchingCreate()\n");
matchingId = sceNetAdhocMatchingCreate( 3,
0xa,
0x22b,
0x800,
0x2dc6c0,
0x5b8d80,
3,
0x7a120,
matchingCallback);
if(matchingId < 0)
{
printf("matchingId = %x\n", matchingId);
}
g_NetAdhocMatchingCreate = true;
char tempStr[100];
tempStr[0] = '\0';
if(strlen(MatchingData))
{
strncpy(tempStr, strrchr(MatchingData, '/')+1, 100);
strrchr(tempStr, '.')[0] = '\0';
}
printf("tempStr=%s\n", tempStr);
printf("sceNetAdhocMatchingStart()\n");
err = sceNetAdhocMatchingStart(matchingId, // 1 in lumines (presuming what is returned from create)
0x10, // 0x10
0x2000, // 0x2000
0x10, // 0x10
0x2000, // 0x2000
strlen(tempStr)+1,
tempStr);
if(err != 0)
{
printf("error = %x\n", err);
}
g_NetAdhocMatchingStart = true;
// All the init functions have passed
return 0;
}
# Additional Stubs for sceNet APIs (not yet in the PSPSDK)
# NOTE: require tricky user entry patching when loaded from kernel thread
.set noreorder
.include "psp/Adhoc/common.s"
STUB_START "sceNet",0x90000,0x00080005
STUB_FUNC 0x39af39a6,sceNetInit
STUB_FUNC 0x281928a9,sceNetTerm
STUB_FUNC 0x50647530,sceNetFreeThreadinfo
STUB_FUNC 0xad6844c6,sceNetThreadAbort
STUB_FUNC 0x89360950,sceNetEtherNtostr
STUB_FUNC 0xd27961c9,sceNetEtherStrton
STUB_FUNC 0x0bf0a3ae,sceNetGetLocalEtherAddr
STUB_FUNC 0xcc393e48,sceNetGetMallocStat
STUB_END
STUB_START "sceNetInet",0x90000,0x001c0005
STUB_FUNC 0x17943399,sceNetInetInit
STUB_FUNC 0xa9ed66b9,sceNetInetTerm
STUB_FUNC 0xdb094e1b,sceNetInetAccept
STUB_FUNC 0x1a33f9ae,sceNetInetBind
STUB_FUNC 0x8d7284ea,sceNetInetClose
STUB_FUNC 0x805502dd,sceNetInetCloseWithRST
STUB_FUNC 0x410b34aa,sceNetInetConnect
STUB_FUNC 0xe247b6d6,sceNetInetGetpeername
STUB_FUNC 0x162e6fd5,sceNetInetGetsockname
STUB_FUNC 0x4a114c7c,sceNetInetGetsockopt
STUB_FUNC 0xd10a1a7a,sceNetInetListen
STUB_FUNC 0xfaabb1dd,sceNetInetPoll
STUB_FUNC 0xcda85c99,sceNetInetRecv
STUB_FUNC 0xc91142e4,sceNetInetRecvfrom
STUB_FUNC 0xeece61d2,sceNetInetRecvmsg
STUB_FUNC 0x5be8d595,sceNetInetSelect
STUB_FUNC 0x7aa671bc,sceNetInetSend
STUB_FUNC 0x05038fc7,sceNetInetSendto
STUB_FUNC 0x774e36f4,sceNetInetSendmsg
STUB_FUNC 0x2fe71fe7,sceNetInetSetsockopt
STUB_FUNC 0x4cfe4e56,sceNetInetShutdown
STUB_FUNC 0x8b7b220f,sceNetInetSocket
STUB_FUNC 0x80a21abd,sceNetInetSocketAbort
STUB_FUNC 0xfbabe411,sceNetInetGetErrno
STUB_FUNC 0xb75d5b0a,sceNetInetInetAddr
STUB_FUNC 0x1bdf5d13,sceNetInetInetAton
STUB_FUNC 0xd0792666,sceNetInetInetNtop
STUB_FUNC 0xe30b8c19,sceNetInetInetPton
STUB_END
/**
* Create a PDP object.
*
* @param mac - Your MAC address (from sceWlanGetEtherAddr)
* @param port - Port to use, lumines uses 0x309
* @param unk2 - Unknown, lumines sets to 0x400
* @param unk3 - Unknown, lumines sets to 0
*
* @return The ID of the PDP object (< 0 on error)
*/
int sceNetAdhocPdpCreate(unsigned char *mac, unsigned short port, unsigned int unk2, int unk3);
/**
* Set a PDP packet to a destination
*
* @param id - The ID as returned by ::sceNetAdhocPdpCreate
* @param destMacAddr - The destination MAC address, can be set to all 0xFF for broadcast
* @param port - The port to send to
* @param data - The data to send
* @param len - The length of the data.
* @param unk6 - Unknown, set to 0
* @param unk7 - Unknown, set to 0
*
* @return Bytes sent, < 0 on error
*/
int sceNetAdhocPdpSend(int id, unsigned char *destMacAddr, unsigned short port, void *data, unsigned int len, int unk6, int unk7);
/**
* Receive a PDP packet
*
* @param id - The ID of the PDP object, as returned by ::sceNetAdhocPdpCreate
* @param srcMacAddr - Buffer to hold the source mac address of the sender
* @param port - Buffer to hold the port number of he received data
* @param data - Data buffer
* @param dataLength - The length of the data buffer
* @param unk6 - Set to 0
* @param unk7 - Set to 0
*
* @return Number of bytes received, < 0 on error.
*/
int sceNetAdhocPdpRecv(int id, unsigned char *srcMacAddr, unsigned short *port, void *data, void *dataLength, int unk6, int unk7);
kYp escribió:Primero necesitas cargar los prx`s necesarias de las librerias que uses para ello necesitas un codigo que las cargue y parche por que habia problemas ( esque yo estaba en verano haciendo un programa para pasar archivos con el adhoc solo me faltaba conseguir capturar un paquete enviado hasta que se me jodio el disco duro :\ ) Yo aprendi estudiandome este codigo http://www.gophinx.co.uk/BlackPhoenix/adhoc-examples.rar ( no se si es igual exactamente pero pienso que si )
Te viene con loadutil.c y loadutil.h que te carga y parchea las prx´s
Animo despues de que termine los examenes me voy a poner a rehacer el programa
printf("sceNetAdhocMatchingInit()\n");
err = sceNetAdhocMatchingInit(0x20000);
if(err != 0)
{
printf("error = %x\n", err);
}
g_NetAdhocMatchingInit = true;
printf("sceNetAdhocMatchingCreate()\n");
matchingId = sceNetAdhocMatchingCreate( 3,
0xa,
0x22b,
0x800,
0x2dc6c0,
0x5b8d80,
3,
0x7a120,
matchingCallback);
if(matchingId < 0)
{
printf("matchingId = %x\n", matchingId);
}
g_NetAdhocMatchingCreate = true;
char tempStr[100];
tempStr[0] = '\0';
if(strlen(MatchingData))
{
strncpy(tempStr, strrchr(MatchingData, '/')+1, 100);
strrchr(tempStr, '.')[0] = '\0';
}
printf("tempStr=%s\n", tempStr);
printf("sceNetAdhocMatchingStart()\n");
err = sceNetAdhocMatchingStart(matchingId, // 1 in lumines (presuming what is returned from create)
0x10, // 0x10
0x2000, // 0x2000
0x10, // 0x10
0x2000, // 0x2000
strlen(tempStr)+1,
tempStr);
if(err != 0)
{
printf("error = %x\n", err);
}
g_NetAdhocMatchingStart = true;
edelpuerto escribió:psp 1 (solo envia)
He puesto una psp (anfitrion) enviando paquetes continuamente a intervalos de 1 segundo, en un bucle a la direccion broadcast, y por el puerto 0x309. La psp envia paquetes continuamente y se ve como la luz parapadea cada segundo en cada envio.
edelpuerto escribió:psp 2 (solo recibe)
En la otra la he puesto a la escucha. La he puesto metida en un bucle, hasta que lea algo.
Dudas:
1) cuando pongo la funcion:
sceNetAdhocPdpRecv(pdpRd, mac2,0,buffer,&length,0,1)
-PdpRd es el id devuelto por sceNetAdhocPdpCreate. Me imagino que antes de recibir hay que usar al funcion sceNetAdhocPdpCreate y de ahi saca el id.
edelpuerto escribió:-mac2 al principio será la de broadcast, hasta que el anfitrion le envie la suya en el campo data y pueda saberla el cliente. (¿es asi?)
edelpuerto escribió:-este campo es el que me da problemas, solo me admite poner 0, si le pongo el mismo puerto que usa el anfitrion (0x309) me da error el compilador:
main.c: En la función ‘readpkg’:
main.c:225: aviso: el paso del argumento 3 de ‘sceNetAdhocPdpRecv’ crea un puntero desde un entero sin una conversión
edelpuerto escribió:-el campo buffer, me supongo que será lo que se lee
edelpuerto escribió:-el campo length, me supongo que será el tamaño de lo que se lee. o sea que si quiero leer solo los 4 bytes primeros pues pongo 4 y el buffer sera una cadena de caracteres (yo le puse buffer[200]);
edelpuerto escribió:- y los campos 6 y 7 puse 0, 1 (como los lummies)
/**
* Receive a PDP packet
*
* @param id - The ID of the PDP object, as returned by ::sceNetAdhocPdpCreate
* @param srcMacAddr - Buffer to hold the source mac address of the sender
* @param port - Buffer to hold the port number of he received data
* @param data - Data buffer
* @param dataLength - The length of the data buffer
* @param unk6 - Set to 0
* @param unk7 - Set to 0
*
* @return Number of bytes received, < 0 on error.
*/
int sceNetAdhocPdpRecv(int id, unsigned char *srcMacAddr, unsigned short *port, void *data, void *dataLength, int unk6, int unk7);
edelpuerto escribió:2) Otra duda: ¿pueda que despues de la funcion:sceNetAdhocPdpRecv tenga que leer datos recibidos con la funcion: sceNetAdhocGetPdpStat?( bueno primero lo mas urgente que me devuelva 0 la funcion: sceNetAdhocPdpRecv)
edelpuerto escribió:3)de momento el recibir no me va, no sé si será porque para recibir solo puedo poner 0 en el campo puerto.
edelpuerto escribió:METODOS para establecer la conversacion(esto es lo que he pensado) orientame porfa.
A) el anfitrion enviará broadcast con datos determinados (el nombre del juego codificado). La psp invitada leera que esos datos es el mismo juego suyo. Entonces, la psp invitada enviará su mac por broadcast en el campo datos por el mismo puerto y el anfitrion podrá coger la mac. Luego el anfitrion enviará su mac en el campo datos a la direccion del invitado, y el invitado tomará esa direccion y asi ya "hablarán ellos solos".
B) Otro metodo sería que el anfitrion manda por broadcast el nombre del juego y su mac por el puerto (0x309). La psp invitada lee y si pertenece a su juego pues ya sabe la mac del anfitrion. Luego la psp invitada envia su mac anfitrion. El anfitrion lee la mac de la psp invitada y asi hablaran solas.
C) Otro metodo sería las 2 psp lanzan broadcast en el campo datos (el nombre del juego+mac) por el mismo puerto(0x309). A la vez que envian leen, cuando detecten el nombre del juego iguales tambien sabran las mac. Y asi cada uno tendrá la mac del otro y solo "hablaran entre ellas".
edelpuerto escribió:1) Si yo lanzo broadcast desde una psp, ella misma no recibe sus mismos broadcast?
edelpuerto escribió:2) Pongamos psp1 y psp2. Si la psp1 lanza un mensaje a la mac de la psp2 y la psp2 no esta continuamente escuchando,¿ este mensaje se queda almacenado en el PDP(descriptor) y cuando se le da la orden sceNetAdhocPdpRecv es cuando la psp2"saca" el mensaje del desriptor?
edelpuerto escribió:3) cada vez que se envie o reciba, se necesita crear un PDP(descriptor) con sceNetAdhocPdpCreate?
edelpuerto escribió:curiosidades:
Puse el tropix con airmon para "monitorizar" la "conversacion de las 2 psp. la curiosidad es que la psp primera que abre la conexion crea un punto de acceso digamos virtual por la que las demas se comunican. y ademas a ese "punto de acceso virutual" cada vez cambia la direccion mac, en cada conexion nueva y tambien le da un nombre a la red: PSP_AULUSP99999_L_
edelpuerto escribió:Ahora me quede terminar de lanzar "bombas" y maquillar las imagenes y el diseño( que coneso es lo mas tiempo se pierde).
cuando este "funcional" lo mismo, pongo una beta.
Seguiré informando. Gracias amigoo.