352 lines
8.3 KiB
C++
352 lines
8.3 KiB
C++
|
|
#include "parser.hpp"
|
|
#include <cstring>
|
|
#if defined(GEKKO)
|
|
int net_initialized = 0;
|
|
char bba_local_ip[16];
|
|
char bba_netmask[16];
|
|
char bba_gateway[16];
|
|
#if defined(HW_DOL)
|
|
#include <ogc/exi.h>
|
|
|
|
int bba_exists = 0;
|
|
unsigned int exi_get_id(int chn, int dev)
|
|
{
|
|
u32 cid = 0;
|
|
EXI_GetID(chn,dev,&cid);
|
|
return cid;
|
|
}
|
|
|
|
int exi_bba_exists()
|
|
{
|
|
return exi_get_id(EXI_CHANNEL_0,EXI_DEVICE_2) == EXI_BBA_ID;
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
namespace BoxScript
|
|
{
|
|
void sockets_free()
|
|
{
|
|
#if defined(HW_RVL) && defined(LIBWIISOCKET)
|
|
wiisocket_deinit();
|
|
#elif defined(HW_RVL) && !defined(LIBWIISOCKET)
|
|
net_deinit();
|
|
#elif defined(_WIN32) || defined(WIN32)
|
|
WSACleanup();
|
|
#endif
|
|
}
|
|
|
|
int NetworkInit()
|
|
{
|
|
#if defined(LIBWIISOCKET)
|
|
return wiisocket_init();
|
|
#endif
|
|
#if defined(GEKKO) && !defined(LIBWIISOCKET)
|
|
int res;
|
|
#if defined(HW_DOL)
|
|
|
|
bba_exists = exi_bba_exists();
|
|
if(bba_exists && !net_initialized) {
|
|
#else
|
|
if(!net_initialized){
|
|
#endif
|
|
res = if_config(bba_local_ip, bba_netmask, bba_gateway, true,20);
|
|
if(res >= 0 && strcmp("255.255.255.255", bba_local_ip)) {
|
|
net_initialized = 1;
|
|
}
|
|
else {
|
|
net_initialized = 0;
|
|
}
|
|
}
|
|
#elif defined(_WIN32) || defined(WIN32)
|
|
int err= WSAStartup(0x202, &wsaData);
|
|
if (err != 0) {
|
|
/* Tell the user that we could not find a usable */
|
|
/* Winsock DLL. */
|
|
printf("WSAStartup failed with error: %d\n", err);
|
|
return 1;
|
|
}
|
|
|
|
/* Confirm that the WinSock DLL supports 2.2.*/
|
|
/* Note that if the DLL supports versions greater */
|
|
/* than 2.2 in addition to 2.2, it will still return */
|
|
/* 2.2 in wVersion since that is the version we */
|
|
/* requested. */
|
|
|
|
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {
|
|
/* Tell the user that we could not find a usable */
|
|
/* WinSock DLL. */
|
|
printf("Could not find a usable version of Winsock.dll\n");
|
|
WSACleanup();
|
|
return 1;
|
|
}
|
|
|
|
#else
|
|
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
NetworkStream::NetworkStream(SOCKET i)
|
|
{
|
|
this->fd = i;
|
|
}
|
|
|
|
void NetworkStream::Write(uint8_t* data,size_t len)
|
|
{
|
|
#if defined(OGC_NETWORKING)
|
|
net_send(this->fd,data,len,0);
|
|
#else
|
|
int flags=0;
|
|
#if __linux__
|
|
flags=MSG_NOSIGNAL;
|
|
#endif
|
|
send(this->fd,data,len,flags);
|
|
#endif
|
|
}
|
|
size_t NetworkStream::Read(uint8_t* data,size_t len)
|
|
{
|
|
#if defined(OGC_NETWORKING)
|
|
ssize_t v=(ssize_t)net_recv(this->fd,data,len,0);
|
|
if(v < 0) return 0;
|
|
return (size_t)v;
|
|
#else
|
|
int flags=0;
|
|
#if __linux__
|
|
flags=MSG_NOSIGNAL;
|
|
#endif
|
|
ssize_t v=recv(this->fd,data,len,flags);
|
|
if(v < 0) return 0;
|
|
return (size_t)v;
|
|
#endif
|
|
}
|
|
int64_t NetworkStream::GetPosition()
|
|
{
|
|
return 0;
|
|
}
|
|
int64_t NetworkStream::GetLength()
|
|
{
|
|
return 0;
|
|
}
|
|
void NetworkStream::SetPosition(int64_t pos)
|
|
{
|
|
|
|
}
|
|
void NetworkStream::Flush()
|
|
{
|
|
|
|
}
|
|
void NetworkStream::Close()
|
|
{
|
|
#if defined(OGC_NETWORKING)
|
|
net_close(this->fd);
|
|
#else
|
|
close(this->fd);
|
|
#endif
|
|
|
|
}
|
|
bool NetworkStream::CanRead()
|
|
{
|
|
return true;
|
|
}
|
|
bool NetworkStream::CanWrite()
|
|
{
|
|
return true;
|
|
}
|
|
bool NetworkStream::CanSeek()
|
|
{
|
|
return false;
|
|
}
|
|
struct hostent* _______ghbn(string ip)
|
|
{
|
|
#if defined(GEKKO) && !defined(LIBWIISOCKET)
|
|
return net_gethostbyname(ip.c_str());
|
|
#else
|
|
return gethostbyname(ip.c_str());
|
|
#endif
|
|
}
|
|
|
|
NetworkStream* NetClient(string ip,int64_t port,SOCKET fd)
|
|
|
|
{
|
|
struct sockaddr_in serv_addr;
|
|
serv_addr.sin_family = AF_INET;
|
|
serv_addr.sin_port = htons((uint16_t)port);
|
|
|
|
if (inet_aton( ip.c_str(), &serv_addr.sin_addr)
|
|
<= 0) {
|
|
struct hostent* host=_______ghbn(ip);
|
|
struct in_addr **addr_list;
|
|
|
|
addr_list = (struct in_addr **)host->h_addr_list;
|
|
if(host->h_length > 0)
|
|
{
|
|
memcpy(&serv_addr.sin_addr,addr_list[0],sizeof(struct in_addr));
|
|
}else{
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
#if defined(GEKKO) && !defined(LIBWIISOCKET)
|
|
if(net_connect(fd,(struct sockaddr*)&serv_addr,sizeof(struct sockaddr_in)))
|
|
{
|
|
return NULL;
|
|
}
|
|
#else
|
|
if(connect(fd,(struct sockaddr*)&serv_addr,sizeof(struct sockaddr_in)))
|
|
{
|
|
return NULL;
|
|
}
|
|
#endif
|
|
return new NetworkStream(fd);
|
|
}
|
|
SOCKET NetServerInit(string ip,int64_t port,int fd)
|
|
{
|
|
struct sockaddr_in serv_addr;
|
|
serv_addr.sin_family = AF_INET;
|
|
serv_addr.sin_port = htons(port);
|
|
|
|
if (inet_aton( ip.c_str(), &serv_addr.sin_addr)
|
|
<= 0) {
|
|
struct hostent* host=_______ghbn(ip);
|
|
struct in_addr **addr_list;
|
|
|
|
addr_list = (struct in_addr **)host->h_addr_list;
|
|
if(host->h_length > 0)
|
|
{
|
|
memcpy(&serv_addr.sin_addr,addr_list[0],sizeof(struct in_addr));
|
|
}else{
|
|
throw exception();
|
|
}
|
|
}
|
|
#if defined(GEKKO) && !defined(LIBWIISOCKET)
|
|
if(net_bind(fd,(struct sockaddr*)&serv_addr,sizeof(struct sockaddr_in))< 0)
|
|
{
|
|
printf("bind error, is your computer already listening on that port\n");
|
|
throw exception();
|
|
}
|
|
if(net_listen(fd,100) > 0)
|
|
{
|
|
printf("listen error");
|
|
throw exception();
|
|
}
|
|
#else
|
|
if(bind(fd,(struct sockaddr*)&serv_addr,sizeof(struct sockaddr_in))< 0)
|
|
{
|
|
printf("bind error, is your computer already listening on that port\n");
|
|
throw exception();
|
|
}
|
|
if(listen(fd,100) > 0)
|
|
{
|
|
printf("listen error");
|
|
throw exception();
|
|
}
|
|
#endif
|
|
return fd;
|
|
}
|
|
|
|
SOCKET TcpServerInit(string ip,int64_t port)
|
|
{
|
|
SOCKET fd;
|
|
|
|
#if defined(GEKKO) && !defined(LIBWIISOCKET)
|
|
if ((fd = net_socket(AF_INET, SOCK_STREAM, 0)) < 0) {
|
|
printf("\n Socket creation error \n");
|
|
return -1;
|
|
}
|
|
#else
|
|
if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
|
|
printf("\n Socket creation error \n");
|
|
return -1;
|
|
}
|
|
#endif
|
|
return NetServerInit(ip,port,fd);
|
|
}
|
|
SOCKET UdpServerInit(string ip,int64_t port)
|
|
{
|
|
SOCKET fd;
|
|
|
|
#if defined(GEKKO) && !defined(LIBWIISOCKET)
|
|
if ((fd = net_socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
|
|
printf("\n Socket creation error \n");
|
|
return -1;
|
|
}
|
|
#else
|
|
if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
|
|
printf("\n Socket creation error \n");
|
|
return -1;
|
|
}
|
|
#endif
|
|
return NetServerInit(ip,port,fd);
|
|
}
|
|
|
|
|
|
Stream* AcceptClient(SOCKET fd,string* ip)
|
|
{
|
|
struct sockaddr_in clt_addr;
|
|
socklen_t clt_addr_len = sizeof(struct sockaddr_in);
|
|
#if defined(GEKKO) && !defined(LIBWIISOCKET)
|
|
int cltFd=net_accept(fd,(struct sockaddr*)&clt_addr,&clt_addr_len);
|
|
#else
|
|
#if defined(_WIN32) || defined(WIN32)
|
|
SOCKET cltFd=accept(fd,(struct sockaddr*)&clt_addr,&clt_addr_len);
|
|
#else
|
|
int cltFd=accept(fd,(struct sockaddr*)&clt_addr,&clt_addr_len);
|
|
#endif
|
|
#endif
|
|
ip->append(inet_ntoa(clt_addr.sin_addr));
|
|
|
|
return new NetworkStream(cltFd);
|
|
}
|
|
NetworkStream* TcpClient(string ip,int64_t port)
|
|
{
|
|
|
|
#if defined(_WIN32) || defined(WIN32)
|
|
SOCKET fd;
|
|
#else
|
|
int fd;
|
|
#endif
|
|
#if defined(GEKKO) && !defined(LIBWIISOCKET)
|
|
if ((fd = net_socket(AF_INET, SOCK_STREAM, 0)) < 0) {
|
|
printf("\n Socket creation error \n");
|
|
return NULL;
|
|
}
|
|
#else
|
|
if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
|
|
printf("\n Socket creation error \n");
|
|
return NULL;
|
|
}
|
|
#endif
|
|
return NetClient(ip,port,fd);
|
|
}
|
|
|
|
NetworkStream* UdpClient(string ip,int64_t port)
|
|
{
|
|
#if defined(_WIN32) || defined(WIN32)
|
|
SOCKET fd;
|
|
#else
|
|
int fd;
|
|
#endif
|
|
#if defined(GEKKO) && !defined(LIBWIISOCKET)
|
|
if ((fd = net_socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
|
|
printf("\n Socket creation error \n");
|
|
return NULL;
|
|
}
|
|
#else
|
|
if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
|
|
printf("\n Socket creation error \n");
|
|
return NULL;
|
|
}
|
|
#endif
|
|
return NetClient(ip,port,fd);
|
|
}
|
|
|
|
}; |