+#ifdef __statement
+#undef __statement
+#endif
+#define __statement(x) __extension__(x) // To compile for Android/X86 (Need to add support to eC)
+ // Also had to add __extension__ to __swap16md macro in endian.h
namespace net;
#ifndef ECERE_NONET
#if defined(__WIN32__)
-
+#define SOCKLEN_TYPE int
#define WIN32_LEAN_AND_MEAN
+#define String _String
#include <winsock.h>
-static WSADATA wsaData;
+#undef String
#elif defined(__unix__) || defined(__APPLE__)
default:
+#define SOCKLEN_TYPE socklen_t
+#define set _set
#define uint _uint
#include <sys/time.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/time.h>
#include <arpa/inet.h>
+#undef set
#undef uint
private:
import "network"
+#ifdef __ANDROID__
+// TOFIX:
+#undef ntohs
+#undef htons
+#define ntohs(x) (x)
+#define htons(x) (x)
+#endif
+
public class Service
{
public:
virtual void OnAccept();
+ s = -1;
+
// --- Services ---
bool Start()
#if defined(__WIN32__) || defined(__unix__) || defined(__APPLE__)
SOCKET s;
+ if(this.s != -1)
+ return false; // Already started
+
#ifdef DEBUG_SOCKETS
Log("[P] [NStartService]\n");
#endif
{
if(!listen(s,5))
{
- // Fix up the links/offsets here...
network.mutex.Wait();
network.services.Add(this);
this.s = s;
destroyed = false;
sockets.Clear();
- sockets.offset = (uint)&((Socket)0).prev;
+ // Fix up the links/offsets here...
+ sockets.offset = (uint)(uintptr)&((Socket)0).prev;
FD_SET(s, &network.readSet);
FD_SET(s, &network.exceptSet);
- if(s >= network.ns)
+ if(s >= network.ns)
{
- network.ns = s+1;
+ network.ns = (int)(s+1);
network.socketsSemaphore.Release();
}
network.mutex.Release();
Log("[P] [NStopService]\n");
#endif
+ network.mutex.Wait();
while((socket = sockets.first))
{
- socket.Free();
+ socket.Free(false);
delete socket;
}
+ network.mutex.Release();
- if(s)
+ if(s != -1)
{
network.mutex.Wait();
+ this.s = -1;
network.services.Remove(this);
FD_CLR(s, &network.readSet);
FD_CLR(s, &network.exceptSet);
network.mutex.Release();
closesocket(s);
- this.s = 0;
}
Network_DetermineMaxSocket();
bool Process()
{
bool gotEvent = false;
- fd_set rs, ws, es;
- int selectResult;
-
- FD_ZERO(&rs);
- FD_ZERO(&ws);
- FD_ZERO(&es);
- FD_SET(s, &rs);
- //FD_SET(s, &ws);
- FD_SET(s, &es);
-
- selectResult = select(s+1, &rs, &ws, &es, null);
- if(selectResult > 0)
+ if(s != -1)
{
- if(FD_ISSET(s, &rs))
+ fd_set rs, ws, es;
+ int selectResult;
+ struct timeval tvTO = {0, 200000};
+
+ FD_ZERO(&rs);
+ FD_ZERO(&ws);
+ FD_ZERO(&es);
+ FD_SET(s, &rs);
+ //FD_SET(s, &ws);
+ FD_SET(s, &es);
+
+ selectResult = select((int)(s+1), &rs, &ws, &es, &tvTO);
+ if(selectResult > 0)
{
- accepted = false;
- OnAccept();
- if(!accepted)
+ if(FD_ISSET(s, &rs))
{
- SOCKET s;
- SOCKADDR_IN a;
- int addrLen = sizeof(a);
- s = accept(this.s,(SOCKADDR *)&a,&addrLen);
- closesocket(s);
+ accepted = false;
+ OnAccept();
+ if(!accepted)
+ {
+ SOCKET s;
+ SOCKADDR_IN a;
+ SOCKLEN_TYPE addrLen = sizeof(a);
+ s = accept(this.s,(SOCKADDR *)&a,&addrLen);
+ closesocket(s);
+ }
+ gotEvent |= true;
}
- gotEvent |= true;
}
}
return gotEvent;