-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.c
More file actions
136 lines (127 loc) · 4.34 KB
/
server.c
File metadata and controls
136 lines (127 loc) · 4.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#include "network_board.h"
#define PORT 8080
typedef struct {
int board[9][11];
int guess[9][11];
int ship_counts[5];
} Player;
int main(int argc, char const *argv[])
{
int server_fd, new_socket, valread;
struct sockaddr_in address;
int opt = 1;
int addrlen = sizeof(address);
char buffer[1024] = {0};
char *hello = "Hello from server";
// Creating socket file descriptor
// socket descriptor uses IP v 4 with TCP connection
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0)
{
perror("socket failed");
exit(EXIT_FAILURE);
}
// Forcefully attaching socket to the port 8080
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT,
&opt, sizeof(opt)))
{
perror("setsockopt");
exit(EXIT_FAILURE);
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons( PORT );
// Forcefully attaching socket to the port 8080
if (bind(server_fd, (struct sockaddr *)&address,
sizeof(address))<0)
{
perror("bind failed");
exit(EXIT_FAILURE);
}
if (listen(server_fd, 3) < 0)
{
perror("listen");
exit(EXIT_FAILURE);
}
if ((new_socket = accept(server_fd, (struct sockaddr *)&address,
(socklen_t*)&addrlen))<0)
{
perror("accept");
exit(EXIT_FAILURE);
}
/*
send a verification message to ensure connection has taken place
*/
valread = read( new_socket , buffer, 1024);
printf("%s\n",buffer );
send(new_socket , hello , strlen(hello) , 0 );
printf("Hello message sent\n");
/*
initialize ship counts, player arrays, and board arrays
*/
Player *client = malloc(sizeof(Player));
Player *server = malloc(sizeof(Player));
make_ship_counts(client->ship_counts);
make_ship_counts(server->ship_counts);
make_board(client->guess);
make_board(server->guess);
/*
Allow player 1 to populate their board, put player 2 in a rest state
*/
printf("Waiting for Player 1 Board Generation\n");
build_board_server(client->board,new_socket);
usleep(wait_time);
sprintf(buffer,"%s","Waiting for Player 2 Board Generation");
send(new_socket,buffer,strlen(buffer),0);
build_board(server->board);
/*
Initialize the gameplay component, that alternates between players and
allows for the guessing of ships until a win state has been reached.
*/
char * board_str = malloc(1000* sizeof(char));
int playerTurn = 0;
while(!hasLost(client->ship_counts) && !hasLost(server->ship_counts)) { //As long as no one has lost
usleep(wait_time);
send(new_socket,"Nope",strlen("Nope"),0); //Sends when game continues
if(!playerTurn) { //Client's turn
printf("Player 1's Turn\n");
//First send the boards for the players reference
usleep(wait_time);
send(new_socket,"Player 1's Turn", strlen("Player 1's Turn"),0);
memset(board_str, 0, strlen(board_str));
getBoardString(client->guess,board_str);
usleep(wait_time);
send(new_socket, board_str, strlen(board_str),0);
memset(board_str, 0, strlen(board_str));
getBoardString(client->board,board_str);
usleep(wait_time);
send(new_socket, board_str, strlen(board_str),0);
//make guess
make_guess_server(server->board, client->guess, server->ship_counts,new_socket);
playerTurn = 1;
} else { //Server's turn
//First send the boards for the players reference
printf("Player 2's Turn\n\n");
printf("Your Guesses:\n");
print_board(server->guess);
printf("\n");
printf("Your Board:\n");
print_board(server->board);
printf("\n");
//make guess
make_guess(client->board, server->guess, client->ship_counts);
playerTurn = 0;
}
}
usleep(wait_time);
send(new_socket,"Done",strlen("Done"),0);
usleep(wait_time);
//check for win state based on the value of playerTurn
if(!playerTurn) {
printf("Player 2 Wins!\n");
send(new_socket,"Player 2 Wins!",strlen("Player 2 Wins!"),0);
} else {
printf("Player 1 Wins!\n");
send(new_socket,"Player 1 Wins!",strlen("Player 1 Wins!"),0);
}
return 0;
}