1 #define __statement __extension__ // To compile for Android/X86 (Need to add support to eC)
2 // Also had to add __extension__ to __swap16md macro in endian.h
9 #define WIN32_LEAN_AND_MEAN
10 #define String _String
13 static WSADATA wsaData;
15 #elif defined(__unix__) || defined(__APPLE__)
22 #include <netinet/in.h>
24 #include <sys/socket.h>
26 #include <sys/types.h>
28 #include <arpa/inet.h>
34 typedef struct hostent HOSTENT;
35 typedef struct sockaddr SOCKADDR;
36 typedef struct sockaddr_in SOCKADDR_IN;
37 typedef struct in_addr IN_ADDR;
38 #define closesocket(s) close(s)
47 property int port { set { port = value; } get { return port; } };
48 property Socket firstClient { get { return sockets.first; } };
49 property bool processAlone { get { return processAlone; } set { processAlone = value; } };
51 virtual void OnAccept();
59 #if defined(__WIN32__) || defined(__unix__) || defined(__APPLE__)
63 Log("[P] [NStartService]\n");
66 s = socket(AF_INET,SOCK_STREAM,0);
73 a.sin_port=htons((uint16)port);
74 a.sin_addr.s_addr=INADDR_ANY;
76 Log("Service Socket: %x\n", s);
79 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&val, sizeof(val));
80 if(!bind(s,(SOCKADDR *)&a, sizeof(a)))
85 network.services.Add(this);
91 // Fix up the links/offsets here...
92 sockets.offset = (uint)&((Socket)0).prev;
94 FD_SET(s, &network.readSet);
95 FD_SET(s, &network.exceptSet);
98 network.ns = (int)(s+1);
99 network.socketsSemaphore.Release();
101 network.mutex.Release();
113 #if defined(__WIN32__) || defined(__unix__) || defined(__APPLE__)
118 Log("[P] [NStopService]\n");
121 network.mutex.Wait();
122 while((socket = sockets.first))
127 network.mutex.Release();
131 network.mutex.Wait();
133 network.services.Remove(this);
134 FD_CLR(s, &network.readSet);
135 FD_CLR(s, &network.exceptSet);
136 network.mutex.Release();
140 Network_DetermineMaxSocket();
148 bool gotEvent = false;
153 struct timeval tvTO = {0, 200000};
162 selectResult = select((int)(s+1), &rs, &ws, &es, &tvTO);
173 int addrLen = sizeof(a);
174 s = accept(this.s,(SOCKADDR *)&a,&addrLen);
188 Network_Initialize();