177 |
165 |
178 window = initscr(); |
166 window = initscr(); |
179 cbreak(); |
167 cbreak(); |
180 atexit(leavescr); |
168 atexit(leavescr); |
181 |
169 |
182 Server server; |
170 return is_server(&settings) ? server_run(&settings) : client_run(&settings); |
183 settings.server = &server; |
|
184 |
|
185 if (is_server(&settings)) { |
|
186 dump_gameinfo(&(settings.gameinfo)); |
|
187 printw("\nListening for client...\n"); |
|
188 refresh(); |
|
189 if (net_create(&server, settings.port)) { |
|
190 perror("Server creation failed"); |
|
191 return cleanup(&settings, EXIT_FAILURE); |
|
192 } |
|
193 |
|
194 if (net_listen(&server)) { |
|
195 perror("Listening for client failed"); |
|
196 return cleanup(&settings, EXIT_FAILURE); |
|
197 } |
|
198 |
|
199 /* net version handshake */ |
|
200 int fd = server.client->fd; |
|
201 net_send_code(fd, NETCODE_VERSION); |
|
202 if (net_recieve_code(fd) != NETCODE_VERSION) { |
|
203 fprintf(stderr, "Client uses an incompatible software version.\n"); |
|
204 return cleanup(&settings, EXIT_FAILURE); |
|
205 } |
|
206 |
|
207 printw("Client connected - transmitting gameinfo..."); |
|
208 refresh(); |
|
209 |
|
210 |
|
211 net_send_code(fd, NETCODE_GAMEINFO); |
|
212 net_send_data(fd, &(settings.gameinfo), sizeof(settings.gameinfo)); |
|
213 printw("\rClient connected - awaiting challenge acceptance..."); |
|
214 refresh(); |
|
215 int code = net_recieve_code(fd); |
|
216 if (code == NETCODE_ACCEPT) { |
|
217 printw("\rClient connected - challenge accepted."); |
|
218 clrtoeol(); |
|
219 } else if (code == NETCODE_DECLINE) { |
|
220 printw("\rClient connected - challenge declined."); |
|
221 clrtoeol(); |
|
222 } else { |
|
223 fprintf(stderr, "Invalid client response\n"); |
|
224 return cleanup(&settings, EXIT_FAILURE); |
|
225 } |
|
226 } else { |
|
227 if (net_find(&server, settings.serverhost, settings.port)) { |
|
228 fprintf(stderr, "Can't find server\n"); |
|
229 return cleanup(&settings, EXIT_FAILURE); |
|
230 } |
|
231 |
|
232 if (net_connect(&server)) { |
|
233 perror("Can't connect to server"); |
|
234 return cleanup(&settings, EXIT_FAILURE); |
|
235 } |
|
236 |
|
237 int fd = server.fd; |
|
238 if (net_recieve_code(fd) != NETCODE_VERSION) { |
|
239 fprintf(stderr, "Server uses an incompatible software version.\n"); |
|
240 return cleanup(&settings, EXIT_FAILURE); |
|
241 } else { |
|
242 net_send_code(fd, NETCODE_VERSION); |
|
243 } |
|
244 |
|
245 printw("Connection established!\n\n"); |
|
246 refresh(); |
|
247 |
|
248 if (net_recieve_code(fd) == NETCODE_GAMEINFO) { |
|
249 net_recieve_data(fd, &(settings.gameinfo), |
|
250 sizeof(settings.gameinfo)); |
|
251 dump_gameinfo(&(settings.gameinfo)); |
|
252 printw("Accept challenge (y/n)? "); |
|
253 if (prompt_yesno()) { |
|
254 net_send_code(fd, NETCODE_ACCEPT); |
|
255 // TODO: start game |
|
256 } else { |
|
257 net_send_code(fd, NETCODE_DECLINE); |
|
258 } |
|
259 } else { |
|
260 fprintf(stderr, "Server sent invalid gameinfo.\n"); |
|
261 } |
|
262 } |
|
263 |
|
264 return cleanup(&settings, EXIT_SUCCESS); |
|
265 } |
171 } |
266 |
172 |