4 #define __statement(x) __extension__(x) // To compile for Android/X86 (Need to add support to eC)
5 // Also had to add __extension__ to __swap16md macro in endian.h
10 #if defined(__WIN32__)
11 #define SOCKLEN_TYPE int
12 #define WIN32_LEAN_AND_MEAN
13 #define String _String
17 #elif defined(__unix__) || defined(__APPLE__)
19 #define SOCKLEN_TYPE socklen_t
25 #include <netinet/in.h>
27 #include <sys/socket.h>
29 #include <sys/types.h>
31 #include <arpa/inet.h>
37 typedef struct hostent HOSTENT;
38 typedef struct sockaddr SOCKADDR;
39 typedef struct sockaddr_in SOCKADDR_IN;
40 typedef struct in_addr IN_ADDR;
41 #define closesocket(s) close(s)
50 property int port { set { port = value; } get { return port; } };
51 property Socket firstClient { get { return sockets.first; } };
52 property bool processAlone { get { return processAlone; } set { processAlone = value; } };
54 virtual void OnAccept();
62 #if defined(__WIN32__) || defined(__unix__) || defined(__APPLE__)
66 return false; // Already started
69 Log("[P] [NStartService]\n");
72 s = socket(AF_INET,SOCK_STREAM,0);
79 a.sin_port=htons((uint16)port);
80 a.sin_addr.s_addr=INADDR_ANY;
82 Log("Service Socket: %x\n", s);
85 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&val, sizeof(val));
86 if(!bind(s,(SOCKADDR *)&a, sizeof(a)))
91 network.services.Add(this);
97 // Fix up the links/offsets here...
98 sockets.offset = (uint)(uintptr)&((Socket)0).prev;
100 FD_SET(s, &network.readSet);
101 FD_SET(s, &network.exceptSet);
104 network.ns = (int)(s+1);
105 network.socketsSemaphore.Release();
107 network.mutex.Release();
119 #if defined(__WIN32__) || defined(__unix__) || defined(__APPLE__)
124 Log("[P] [NStopService]\n");
127 network.mutex.Wait();
128 while((socket = sockets.first))
133 network.mutex.Release();
137 network.mutex.Wait();
139 network.services.Remove(this);
140 FD_CLR(s, &network.readSet);
141 FD_CLR(s, &network.exceptSet);
142 network.mutex.Release();
146 Network_DetermineMaxSocket();
154 bool gotEvent = false;
159 struct timeval tvTO = {0, 200000};
168 selectResult = select((int)(s+1), &rs, &ws, &es, &tvTO);
179 SOCKLEN_TYPE addrLen = sizeof(a);
180 s = accept(this.s,(SOCKADDR *)&a,&addrLen);
194 Network_Initialize();