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