3#include "gsPlatformSocket.h"
4#include "gsPlatformUtil.h"
13 #include "x360/gsSocketX360.c"
15 #include "xbox/gsSocketXBox.c"
17 #include "win32/gsSocketWin32.c"
23 #include "nitro/gsSocketNitro.c"
25 #include "ps2/gsSocketPs2.c"
27 #include "ps3/gsSocketPs3.c"
28 #include <sys/select.h>
30 #include "psp/gsSocketPSP.c"
31#elif defined(_REVOLUTION)
32 #include "revolution/gsSocketRevolution.c"
34 #error "Missing or unsupported platform"
43 #pragma warning ( disable: 4127 )
50int SetSockBlocking(SOCKET sock,
int isblocking)
54#if defined(_REVOLUTION)
57 val = SOFcntl(sock, SO_F_GETFL, 0);
60 val &= ~SO_O_NONBLOCK;
64 rcode = SOFcntl(sock, SO_F_SETFL, val);
68 val = SOC_Fcntl(sock, SOC_F_GETFL, 0);
71 val &= ~SOC_O_NONBLOCK;
73 val |= SOC_O_NONBLOCK;
75 rcode = SOC_Fcntl(sock, SOC_F_SETFL, val);
77 #if defined(_PS2) || defined(_PS3)
94 rcode = setsockopt(sock, SOL_SOCKET, (isblocking) ? SO_BIO : SO_NBIO, &argp,
sizeof(argp));
98 rcode = setsockopt(sock, SOL_SOCKET, SO_NBIO, &argp,
sizeof(argp));
106 sceInsockSetRecvTimeout(sock, argp);
107 sceInsockSetSendTimeout(sock, argp);
108 sceInsockSetShutdownTimeout(sock, argp);
113 rcode = setsockopt(sock, SCE_NET_INET_SOL_SOCKET, SCE_NET_INET_SO_NBIO, &argp,
sizeof(argp));
115 rcode = setsockopt(sock, SOL_SOCKET, SO_NBIO, &argp,
sizeof(argp));
117 rcode = ioctlsocket(sock, FIONBIO, &argp);
123 gsDebugFormat(GSIDebugCat_Common, GSIDebugType_Network, GSIDebugLevel_Comment,
124 "SetSockBlocking: Set socket %d to %s\r\n", (
unsigned int)sock, isblocking ?
"blocking":
"non-blocking");
128 gsDebugFormat(GSIDebugCat_Common, GSIDebugType_Network, GSIDebugLevel_Comment,
129 "SetSockBlocking failed: tried to set socket %d to %s\r\n", (
unsigned int)sock, isblocking ?
"blocking":
"non-blocking");
133int SetSockBroadcast(SOCKET sock)
135#if !defined(INSOCK) && !defined(_NITRO) && !defined(_REVOLUTION)
137 if(setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (
char *)&optval,
sizeof(optval)) != 0)
146int DisableNagle(SOCKET sock)
148#if defined(_WIN32) || defined(_UNIX)
152 rcode = setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (
char *)&noDelay,
sizeof(
int));
153 return gsiSocketIsError(rcode);
164 int SetReceiveBufferSize(SOCKET sock,
int size)
167 rcode = setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (
const char *)&size,
sizeof(
int));
168 return gsiSocketIsNotError(rcode);
171 int SetSendBufferSize(SOCKET sock,
int size)
174 rcode = setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (
const char *)&size,
sizeof(
int));
175 return gsiSocketIsNotError(rcode);
178 int GetReceiveBufferSize(SOCKET sock)
186 rcode = getsockopt(sock, SOL_SOCKET, SO_RCVBUF, (
char *)&size, &len);
188 if(gsiSocketIsError(rcode))
194 int GetSendBufferSize(SOCKET sock)
202 rcode = getsockopt(sock, SOL_SOCKET, SO_SNDBUF, (
char *)&size, &len);
204 if(gsiSocketIsError(rcode))
213 #define FD_SET(s,p) ((p)->array[((s) - 1) >> SN_FD_SHR] |= \
214 (unsigned int)(1 << (((s) - 1) & SN_FD_BITS)) )
219#if !defined(_NITRO) && !defined(INSOCK) && !defined(_REVOLUTION)
220 int GSISocketSelect(SOCKET theSocket,
int* theReadFlag,
int* theWriteFlag,
int* theExceptFlag)
225 fd_set * aReadFds = NULL;
226 fd_set * aWriteFds = NULL;
227 fd_set * aExceptFds = NULL;
233 int aOut, aOutLen =
sizeof(aOut);
236 struct timeval aTimeout = { 0, 0 };
238 if (theSocket == INVALID_SOCKET)
243 if(theReadFlag != NULL)
246 FD_SET(theSocket,&aReadSet);
247 aReadFds = &aReadSet;
249 if(theWriteFlag != NULL)
252 FD_SET(theSocket, &aWriteSet);
253 aWriteFds = &aWriteSet;
255 if(theExceptFlag != NULL)
257 FD_ZERO(&aExceptSet);
258 FD_SET(theSocket, &aExceptSet);
259 aExceptFds = &aExceptSet;
264 aResult = socketselect(FD_SETSIZE, aReadFds, aWriteFds, aExceptFds, &aTimeout);
267 aResult = select(FD_SETSIZE, aReadFds, aWriteFds, aExceptFds, &aTimeout);
269 if(gsiSocketIsError(aResult))
276 getsockopt(theSocket, SOL_SOCKET, SO_ERROR, (
char *)&aOut, &aOutLen);
284 if(theReadFlag != NULL)
286 if((aResult > 0) && FD_ISSET(theSocket, aReadFds))
291 if(theWriteFlag != NULL)
293 if((aResult > 0) && FD_ISSET(theSocket, aWriteFds))
298 if(theExceptFlag != NULL)
300 if((aResult > 0) && FD_ISSET(theSocket, aExceptFds))
311int CanReceiveOnSocket(SOCKET sock)
314 if (1 == GSISocketSelect(sock, &aReadFlag, NULL, NULL))
322int CanSendOnSocket(SOCKET sock)
325 if (1 == GSISocketSelect(sock, NULL, &aWriteFlag, NULL))
333#if defined(_PS3) || defined (_PSP)
337HOSTENT * getlocalhost(
void)
342 static HOSTENT localhost;
343 static char * aliases = NULL;
344 static char * ipPtrs[MAX_IPS + 1];
345 static unsigned int ips[MAX_IPS];
347 struct sceEENetIfname * interfaces;
348 struct sceEENetIfname * interface;
357 localhost.h_name =
"localhost";
358 localhost.h_aliases = &aliases;
359 localhost.h_addrtype = AF_INET;
360 localhost.h_length = 0;
361 localhost.h_addr_list = ipPtrs;
364 sceEENetGetIfnames(NULL, &num);
365 interfaces = (
struct sceEENetIfname *)gsimalloc(num *
sizeof(
struct sceEENetIfname));
368 sceEENetGetIfnames(interfaces, &num);
372 for(i = 0 ; i < num ; i++)
375 interface = &interfaces[i];
380 if(sceEENetGetIfinfo(interface->ifn_name, sceEENET_IFINFO_IFFLAGS, &flags, &len) != 0)
385 if(!(flags & (IFF_UP|IFF_RUNNING)) || (flags & IFF_LOOPBACK))
390 len =
sizeof(address);
391 if(sceEENetGetIfinfo(interface->ifn_name, sceEENET_IFINFO_ADDR, &address, &len) != 0)
396 ips[count] = address.s_addr;
397 ipPtrs[count] = (
char *)&ips[count];
409 localhost.h_length = (gsi_u16)
sizeof(ips[0]);
410 ipPtrs[count] = NULL;
418 #define MAX_IPS sceLIBNET_MAX_INTERFACE
419 static HOSTENT localhost;
420 static char * aliases = NULL;
421 static char * ipPtrs[MAX_IPS + 1];
422 static unsigned int ips[MAX_IPS];
425 int aInterfaceIdArray[MAX_IPS];
426 int aNumInterfaces = 0;
427 int aInterfaceNum = 0;
431 aNumInterfaces = sceInetGetInterfaceList(&gGSIInsockClientData,
432 &gGSIInsockSocketBuffer, aInterfaceIdArray, MAX_IPS);
433 if (aNumInterfaces < 1)
437 localhost.h_name =
"localhost";
438 localhost.h_aliases = &aliases;
439 localhost.h_addrtype = AF_INET;
440 localhost.h_addr_list = ipPtrs;
444 for (aInterfaceNum = 0; aInterfaceNum < aNumInterfaces; aInterfaceNum++)
446 sceInetAddress_t anAddr;
447 int result = sceInetInterfaceControl(&gGSIInsockClientData, &gGSIInsockSocketBuffer,
448 aInterfaceIdArray[aInterfaceNum], sceInetCC_GetAddress,
449 &anAddr,
sizeof(anAddr));
453 memcpy(&ips[aCount], anAddr.data,
sizeof(ips[aCount]));
454 ips[aCount] = htonl(ips[aCount]);
455 ipPtrs[aCount] = (
char*)&ips[aCount];
461 localhost.h_length = (gsi_u16)
sizeof(ips[0]);
462 ipPtrs[aCount] = NULL;
468 static HOSTENT localhost;
469 static char * aliases = NULL;
470 static char * ipPtrs[MAX_IPS + 1];
471 static unsigned int ips[MAX_IPS];
475 localhost.h_name =
"localhost";
476 localhost.h_aliases = &aliases;
477 localhost.h_addrtype = AF_INET;
478 localhost.h_length = 0;
479 localhost.h_addr_list = (u8 **)ipPtrs;
482 IP_GetAddr(NULL, (u8*)&ips[count]);
485 ipPtrs[count] = (
char *)&ips[count];
488 localhost.h_length = (gsi_u16)
sizeof(ips[0]);
489 ipPtrs[count] = NULL;
493#elif defined(_REVOLUTION)
495 static HOSTENT aLocalHost;
496 static char * aliases = NULL;
499 static IPAddrEntry aAddrs[MAX_IPS];
500 int aAddrsSize, aAddrsSizeInitial;
501 static u8 * ipPtrs[MAX_IPS + 1];
502 static unsigned int ips[MAX_IPS];
504 aSizeNumOfIps =
sizeof(aNumOfIps);
505 ret = SOGetInterfaceOpt(NULL, SO_SOL_CONFIG, SO_CONFIG_IP_ADDR_NUMBER, &aNumOfIps, &aSizeNumOfIps);
509 aAddrsSize = (int)(MAX_IPS *
sizeof(IPAddrEntry));
510 aAddrsSizeInitial = aAddrsSize;
511 ret = SOGetInterfaceOpt(NULL, SO_SOL_CONFIG, SO_CONFIG_IP_ADDR_TABLE, &aAddrs, &aAddrsSize);
515 if (aAddrsSize != aAddrsSizeInitial)
517 aNumOfIps = aAddrsSize / (int)
sizeof(IPAddrEntry);
520 aLocalHost.h_name =
"localhost";
521 aLocalHost.h_aliases = &aliases;
522 aLocalHost.h_addrtype = AF_INET;
523 aLocalHost.h_length = SO_IP4_ALEN;
525 for (i = 0; i < MAX_IPS; i++)
529 memcpy(&ips[i], &aAddrs[i].addr,
sizeof(aAddrs[i].addr));
530 ipPtrs[i] = (u8 *)&ips[i];
535 aLocalHost.h_addr_list = ipPtrs;
542 static HOSTENT localhost;
543 static char * ipPtrs[2];
546 while((rcode = XNetGetTitleXnAddr(&addr)) == XNET_GET_XNADDR_PENDING)
549 if((rcode == XNET_GET_XNADDR_NONE) || (rcode == XNET_GET_XNADDR_TROUBLESHOOT))
552 localhost.h_name =
"localhost";
553 localhost.h_aliases = NULL;
554 localhost.h_addrtype = AF_INET;
555 localhost.h_length = (gsi_u16)
sizeof(IN_ADDR);
556 localhost.h_addr_list = (gsi_i8 **)ipPtrs;
559 ipPtrs[0] = (
char *)&ip;
569 char hostname[256] =
"";
572 gethostname(hostname,
sizeof(hostname));
575 return gethostbyname(hostname);
580int IsPrivateIP(IN_ADDR * addr)
587 ip = ntohl(addr->s_addr);
588 b1 = (int)((ip >> 24) & 0xFF);
589 b2 = (int)((ip >> 16) & 0xFF);
596 if((b1 == 172) && ((b2 >= 16) && (b2 <= 31)))
600 if((b1 == 192) && (b2 == 168))
606gsi_u32 gsiGetBroadcastIP(
void)
610 IP_GetBroadcastAddr(NULL, (u8*)&ip);
613#elif defined(_REVOLUTION)
624 IPAddrEntry* addrtbl;
629 length = (int)
sizeof( addrnum );
631 ret = SOGetInterfaceOpt(NULL,
633 SO_CONFIG_IP_ADDR_NUMBER,
634 (u8*)&addrnum, &length);
640 length = (int)(
sizeof( IPAddrEntry ) * addrnum);
642 addrtbl = (IPAddrEntry*)gsimalloc( (u32)length );
644 if( addrtbl == NULL )
647 ret = SOGetInterfaceOpt(NULL,
649 SO_CONFIG_IP_ADDR_TABLE,
659 ip = (u32)(addrtbl->bcastAddr[3]
660 | (addrtbl->bcastAddr[2] << 8)
661 | (addrtbl->bcastAddr[1] << 16)
662 | (addrtbl->bcastAddr[0] << 24));
683#pragma warning ( default: 4127 )