7 #define WIN32_LEAN_AND_MEAN
9 static WSADATA wsaData;
11 #elif defined(__unix__) || defined(__APPLE__)
17 #include <netinet/in.h>
19 #include <sys/socket.h>
21 #include <sys/types.h>
23 #include <arpa/inet.h>
28 typedef struct hostent HOSTENT;
29 typedef struct sockaddr SOCKADDR;
30 typedef struct sockaddr_in SOCKADDR_IN;
31 typedef struct in_addr IN_ADDR;
32 #define closesocket(s) close(s)
41 property int port { set { port = value; } get { return port; } };
42 property Socket firstClient { get { return sockets.first; } };
43 property bool processAlone { get { return processAlone; } set { processAlone = value; } };
45 virtual void OnAccept();
53 #if defined(__WIN32__) || defined(__unix__) || defined(__APPLE__)
57 Log("[P] [NStartService]\n");
60 s = socket(AF_INET,SOCK_STREAM,0);
67 a.sin_port=htons((uint16)port);
68 a.sin_addr.s_addr=INADDR_ANY;
70 Log("Service Socket: %x\n", s);
73 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&val, sizeof(val));
74 if(!bind(s,(SOCKADDR *)&a, sizeof(a)))
78 // Fix up the links/offsets here...
80 network.services.Add(this);
86 sockets.offset = (uint)&((Socket)0).prev;
88 FD_SET(s, &network.readSet);
89 FD_SET(s, &network.exceptSet);
93 network.socketsSemaphore.Release();
95 network.mutex.Release();
107 #if defined(__WIN32__) || defined(__unix__) || defined(__APPLE__)
112 Log("[P] [NStopService]\n");
115 network.mutex.Wait();
116 while((socket = sockets.first))
121 network.mutex.Release();
125 network.mutex.Wait();
127 network.services.Remove(this);
128 FD_CLR(s, &network.readSet);
129 FD_CLR(s, &network.exceptSet);
130 network.mutex.Release();
134 Network_DetermineMaxSocket();
142 bool gotEvent = false;
147 struct timeval tvTO = {0, 200000};
156 selectResult = select(s+1, &rs, &ws, &es, &tvTO);
167 int addrLen = sizeof(a);
168 s = accept(this.s,(SOCKADDR *)&a,&addrLen);
182 Network_Initialize();