dvander@2444: #include pred@2129: #include "smud.h" pred@2129: #include "smud_threads.h" pred@2129: pred@2129: #define LISTEN_PORT 6500 pred@2129: #define LISTEN_QUEUE_LENGTH 6 pred@2129: pred@2129: char fileNames[NUM_FILES][30] = { pred@2129: "core.games.txt", pred@2129: "sdktools.games.txt", pred@2129: "sdktools.games.ep2.txt", pred@2462: "sdktools.games.l4d.txt", pred@2129: "sm-cstrike.games.txt", pred@2129: "sm-tf2.games.txt", pred@2129: }; pred@2129: pred@2129: void *fileLocations[NUM_FILES]; pred@2129: int fileLength[NUM_FILES]; pred@2129: pred@2129: int main(int argc, char **argv) pred@2129: { pred@2129: ThreadPool *pool; pred@2129: struct protoent *pProtocol; pred@2129: struct sockaddr_in serverAddress; pred@2129: struct sockaddr_in clientAddress; pred@2129: int serverSocket; pred@2129: int clientSocket; pred@2129: int addressLen; pred@2129: int opts; pred@2129: int file; pred@2129: char filename[100]; pred@2129: struct stat sbuf; pred@2129: dvander@2444: #if defined DEBUG dvander@2444: fprintf(stdout, "Loading Gamedata files into memory\n"); dvander@2444: #endif pred@2129: pred@2129: for (int i=0; iStart()) pred@2129: { dvander@2444: fprintf(stderr, "Could not initialize thread pool!\n"); pred@2129: return 1; pred@2129: } pred@2129: dvander@2444: #if defined DEBUG pred@2129: printf("Create Server Socket\n"); dvander@2444: #endif pred@2129: pred@2129: memset(&serverAddress, 0, sizeof(serverAddress)); pred@2129: serverAddress.sin_family = AF_INET; pred@2129: serverAddress.sin_addr.s_addr = INADDR_ANY; pred@2129: serverAddress.sin_port = htons(LISTEN_PORT); pred@2129: pred@2129: pProtocol = getprotobyname("tcp"); pred@2129: pred@2129: if (pProtocol == NULL) pred@2129: { dvander@2444: fprintf(stderr, "Could not get tcp proto: %s", strerror(errno)); pred@2129: return 1; pred@2129: } pred@2129: pred@2129: serverSocket = socket(AF_INET, SOCK_STREAM, pProtocol->p_proto); pred@2129: pred@2129: if (serverSocket < 0) pred@2129: { dvander@2444: fprintf(stderr, "Could not open socket: %s", strerror(errno)); pred@2129: return 1; pred@2129: } pred@2129: pred@2129: opts = 1; pred@2129: setsockopt(serverSocket, SOL_SOCKET, SO_REUSEADDR, &opts, sizeof(opts)); pred@2129: pred@2129: if (bind(serverSocket, (struct sockaddr *)&serverAddress, sizeof(serverAddress)) < 0) pred@2129: { dvander@2444: fprintf(stderr, "Could not bind socket: %s", strerror(errno)); pred@2129: return 1; pred@2129: } pred@2129: pred@2129: if (listen(serverSocket, LISTEN_QUEUE_LENGTH) < 0) pred@2129: { dvander@2444: fprintf(stderr, "Could not listen on socket: %s", strerror(errno)); pred@2129: return 1; pred@2129: } pred@2129: dvander@2444: fprintf(stdout, "Server has started.\n"); pred@2129: pred@2129: while (1) pred@2129: { pred@2129: addressLen = sizeof(clientAddress); pred@2129: dvander@2444: clientSocket = accept(serverSocket, dvander@2444: (struct sockaddr *)&clientAddress, dvander@2444: (socklen_t *)&addressLen); dvander@2444: if (clientSocket < 0) pred@2129: { dvander@2444: fprintf(stderr, "Could not accept client: %s", strerror(errno)); pred@2129: continue; pred@2129: } pred@2129: pred@2129: opts = fcntl(clientSocket, F_GETFL, 0); pred@2129: if (fcntl(clientSocket, F_SETFL, opts|O_NONBLOCK) < 0) pred@2129: { dvander@2444: fprintf(stderr, "Could not non-block client: %s", strerror(errno)); pred@2129: closesocket(clientSocket); pred@2129: continue; pred@2129: } pred@2129: dvander@2444: #if defined DEBUG dvander@2444: fprintf(stdout, dvander@2444: "Accepting connection from client (sock %d, ip %s)", dvander@2444: clientSocket, pred@2462: inet_ntoa(clientAddress.sin_addr)); dvander@2444: #endif pred@2129: pred@2129: pool->AddConnection(clientSocket); pred@2129: } pred@2129: pred@2129: delete pool; pred@2129: } pred@2129: pred@2129: pred@2129: