Skip to content
Snippets Groups Projects
Commit 95d83ed2 authored by Jake Feddersen's avatar Jake Feddersen
Browse files

Add CHANGELOG, README

parent e44ab316
No related branches found
No related tags found
No related merge requests found
4/19: Initialize project, copy and setup makefile
Experiment with client/server demo files
4/20: Implement game loop
Implement board and ship classes
Preliminary game rendering
Implement networking
4/23: Add ship names, health bars
4/25: Improve game rendering
Handle game end
Add last move, hit/miss indicators
Add status messages
4/26: Add ascii art
More adjustments to rendering positions
Add better handling of socket errors so ncurses doesn't render
the terminal unuseable
Networked Battleship Implementation
Jacob Feddersen
Compile: `make`
Run: `./battleship`
There are no command line parameters for this program
I abstracted the network code for this game to the point where either a
client or server is instantiated, and otherwise the rest of the code is
exactly the same.
The server prints all of the interfaces it knows so the user can select to
which it should bind. It then prints the IP so the user can connect a client
to it. The client prompts the user to enter an IP so it can connect.
Controls:
* Move targeting pointer: Arrow keys
* Select target: Space
Known bugs:
* Ncurses queues input while waiting for the opponent to move
* The game does not know how to handle when the opponent disconnects, and
either exhibits undefined behaviour or crashes
#include "networking.h"
#include "ncurses.h"
char buffer[1000];
......@@ -13,7 +14,8 @@ server_connection::server_connection() {
char addressBuffer[INET_ADDRSTRLEN];
// Creating socket file descriptor
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
destroy_screen();
perror("socket failed");
exit(EXIT_FAILURE);
}
......@@ -72,11 +74,13 @@ server_connection::server_connection() {
// Bind the socket
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
destroy_screen();
perror("bind failed");
exit(EXIT_FAILURE);
}
if (listen(server_fd, 0) < 0) {
destroy_screen();
perror("listen failed");
exit(EXIT_FAILURE);
}
......@@ -90,6 +94,7 @@ server_connection::server_connection() {
refresh();
if ((server_sock = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
destroy_screen();
perror("accept failed");
exit(EXIT_FAILURE);
}
......@@ -126,6 +131,7 @@ std::string server_connection::exchange_message(const std::string &message) {
client_connection::client_connection() {
// Create socket
if ((client_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
destroy_screen();
perror("socket failed");
exit(EXIT_FAILURE);
}
......
File deleted
// Client side C/C++ program to demonstrate Socket programming
#include <iostream>
#include <cstdlib>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <cstring>
#define PORT 8080
using namespace std;
int main(int argc, char const *argv[])
{
struct sockaddr_in address;
int sock = 0, valread;
struct sockaddr_in serv_addr;
const char *hello = "Hello from client";
char buffer[1024] = {0};
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("\n Socket creation error \n");
return -1;
}
memset(&serv_addr, '0', sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
// Convert IPv4 and IPv6 addresses from text to binary form
if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr)<=0)
{
printf("\nInvalid address/ Address not supported \n");
return -1;
}
if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
{
printf("\nConnection Failed \n");
return -1;
}
send(sock , hello , strlen(hello) , 0 );
printf("Hello message sent\n");
valread = read( sock , buffer, 1024);
printf("%s\n",buffer );
return 0;
}
\ No newline at end of file
File deleted
// Server side C/C++ program to demonstrate Socket programming
#include <unistd.h>
#include <iostream>
#include <cstdlib>
#include <netinet/in.h>
#lude <cstring>
#define PORT 8080
using namespace std;
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};
const char *hello = "Hello from server";
// Creating socket file descriptor
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);
}
valread = read( new_socket , buffer, 1024);
if (valread == 0) {
cout << "Read 0" << endl;
}
printf("%s\n",buffer );
send(new_socket , hello , strlen(hello) , 0 );
printf("Hello message sent\n");
return 0;
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment