1 #include <unistd.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
5 
6 
7 #include "serverobject.h"
8 #include "serverconfig.h"
9 #include "netconfig.h"
10 #include "servergame.h"
11 #include "serverdata.h"
12 #include "mainplayerthread.h"
13 #include "readnetworkdata.h"
14 #include "thread.h"
15 #include "collision.h"
16 
17 
18 pthread_t ServerThreads[MAX_PLAYERS+1];
19 ConnectionStruct Connections[MAX_PLAYERS];
20 int GamePort;
21 int listenfd;
22 int StopServer;
23 
24 
Server(void * threadid)25 void *Server(void *threadid)
26 {
27   int rc, i;
28   struct sockaddr_in servaddr;
29   struct timeval timeout;
30 
31   for (i=0; i<MAX_PLAYERS; i++) {
32     Connections[i].Connected=0;
33   }
34   NumConnectedPlayers=0;
35   StopServer=0;
36 
37   if (!threadid) {
38     ReadServerConfig(ServerSingleConfigFileName);
39   }
40 
41   if ((listenfd=socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
42     printf("socket error\n");
43     exit(3);
44   }
45 
46   // Set a timeout of 5 seconds for listening
47   timeout.tv_sec=5;
48   timeout.tv_usec=0;
49   setsockopt(listenfd, SOL_SOCKET, SO_RCVTIMEO,
50 	     &timeout, sizeof(struct timeval));
51 
52   memset(&servaddr, 0, sizeof(servaddr));
53   servaddr.sin_family=AF_INET;
54   servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
55   servaddr.sin_port=htons(GamePort);
56 
57   InitCollisionFunctions();
58 
59   if (bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
60     printf("bind error\n");
61     exit(4);
62   }
63 
64   // Spawn off the main game thread
65   if (rc = pthread_create(&ServerThreads[MAX_PLAYERS], NULL,
66 			  StartGame, (void *)MAX_PLAYERS)) {
67     printf("ERROR, return code from pthread_create() is %d\n", rc);
68     exit(6);
69   }
70 
71   usleep(100000);
72 
73   ReadNetworkData();
74 
75   exit(7);
76 }
77