3 #include "smud_threads.h"
5 #define LISTEN_PORT 6500
6 #define LISTEN_QUEUE_LENGTH 6
8 char fileNames[NUM_FILES][30] = {
11 "sdktools.games.ep2.txt",
12 "sdktools.games.l4d.txt",
13 "sm-cstrike.games.txt",
17 void *fileLocations[NUM_FILES];
18 int fileLength[NUM_FILES];
20 int main(int argc, char **argv)
23 struct protoent *pProtocol;
24 struct sockaddr_in serverAddress;
25 struct sockaddr_in clientAddress;
35 fprintf(stdout, "Loading Gamedata files into memory\n");
38 for (int i=0; i<NUM_FILES; i++)
40 snprintf(filename, sizeof(filename), "./md5/%s", fileNames[i]);
41 file = open(filename, O_RDWR);
45 fprintf(stderr, "Could not find file: %s", filename);
49 if (stat(filename, &sbuf) == -1)
51 fprintf(stderr, "Could not stat file: %s (error: %s)", filename, strerror(errno));
55 if ((fileLocations[i] = mmap(NULL, sbuf.st_size, PROT_READ, MAP_PRIVATE, file, 0)) == MAP_FAILED)
57 fprintf(stderr, "Could not mmap file: %s (error: %s)", filename, strerror(errno));
61 fileLength[i] = sbuf.st_size;
64 fprintf(stdout, "Initialised file of %s of length %i\n", fileNames[i], fileLength[i]);
69 fprintf(stdout, "Initializing Thread Pool\n");
72 pool = new ThreadPool();
76 fprintf(stderr, "Could not initialize thread pool!\n");
81 printf("Create Server Socket\n");
84 memset(&serverAddress, 0, sizeof(serverAddress));
85 serverAddress.sin_family = AF_INET;
86 serverAddress.sin_addr.s_addr = INADDR_ANY;
87 serverAddress.sin_port = htons(LISTEN_PORT);
89 pProtocol = getprotobyname("tcp");
91 if (pProtocol == NULL)
93 fprintf(stderr, "Could not get tcp proto: %s", strerror(errno));
97 serverSocket = socket(AF_INET, SOCK_STREAM, pProtocol->p_proto);
101 fprintf(stderr, "Could not open socket: %s", strerror(errno));
106 setsockopt(serverSocket, SOL_SOCKET, SO_REUSEADDR, &opts, sizeof(opts));
108 if (bind(serverSocket, (struct sockaddr *)&serverAddress, sizeof(serverAddress)) < 0)
110 fprintf(stderr, "Could not bind socket: %s", strerror(errno));
114 if (listen(serverSocket, LISTEN_QUEUE_LENGTH) < 0)
116 fprintf(stderr, "Could not listen on socket: %s", strerror(errno));
120 fprintf(stdout, "Server has started.\n");
124 addressLen = sizeof(clientAddress);
126 clientSocket = accept(serverSocket,
127 (struct sockaddr *)&clientAddress,
128 (socklen_t *)&addressLen);
129 if (clientSocket < 0)
131 fprintf(stderr, "Could not accept client: %s", strerror(errno));
135 opts = fcntl(clientSocket, F_GETFL, 0);
136 if (fcntl(clientSocket, F_SETFL, opts|O_NONBLOCK) < 0)
138 fprintf(stderr, "Could not non-block client: %s", strerror(errno));
139 closesocket(clientSocket);
145 "Accepting connection from client (sock %d, ip %s)",
147 inet_ntoa(clientAddress.sin_addr));
150 pool->AddConnection(clientSocket);