void rpc()
{
unsigned int nsysnet_handle;
OSDynLoad_Acquire("nsysnet.rpl", &nsysnet_handle);
/* Cache, DMA, and socket functions */
int (*socket)(int family, int type, int proto);
int (*connect)(int fd, struct sockaddr *addr, int addrlen);
int (*recv)(int fd, void *buffer, int len, int flags);
int (*send)(int fd, const void *buffer, int len, int flags);
int (*socket_lib_init)(void);
int (*socket_lib_finish)(void);
int (*setsockopt)(int fd, int level, int optname, void *optval, int optlen);
int (*socketclose)(int fd);
/* Read the addresses of the functions */
OSDynLoad_FindExport(nsysnet_handle, 0, "socket_lib_init", &socket_lib_init);
OSDynLoad_FindExport(nsysnet_handle, 0, "socket_lib_finish", &socket_lib_finish);
OSDynLoad_FindExport(nsysnet_handle, 0, "socket", &socket);
OSDynLoad_FindExport(nsysnet_handle, 0, "connect", &connect);
OSDynLoad_FindExport(nsysnet_handle, 0, "recv", &recv);
OSDynLoad_FindExport(nsysnet_handle, 0, "send", &send);
OSDynLoad_FindExport(nsysnet_handle, 0, "setsockopt", &setsockopt);
OSDynLoad_FindExport(nsysnet_handle, 0, "socketclose", &socketclose);
// Initialize the library
socket_lib_init();
/* Set up our socket address structure */
struct sockaddr sin;
sin.sin_family = AF_INET;
sin.sin_port = 12345;
sin.sin_addr.s_addr = PC_IP;
int i;
for (i = 0; i < 8; i++)
{
sin.sin_zero[i] = 0;
}
// Create a socket
int rpc = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
int optval=1;
int optlen = sizeof(optval);
// Set the KEEPALIVE option active
setsockopt(rpc, -1, 0x00008, &optval, optlen);
// Connect
int status = connect(rpc, &sin, 0x10);
if (status) {
// Error
return 0;
}
// RPC LOOP
/* Block waiting for data */
uint32_t buffer[128];
while(1)
{
/* Get data from the socket */
if(recv(rpc, buffer, 512, 0x20)>0) {
/* Look at the command byte */
switch (buffer[0])
{
/* [...] */
}
}
}
socketclose(rpc);
socket_lib_finish();
}