From 830c130ded1f6964a49e10b9ebdba132d8a6e883 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 25 Feb 2026 08:40:42 -0600 Subject: [PATCH] first commit --- README.md | 13 ++++ ncurses test/Makefile | 18 +++++ ncurses test/ncursestest | Bin 0 -> 17376 bytes ncurses test/ncursestest.cpp | 37 +++++++++ network more complicated/Makefile | 19 +++++ network more complicated/client | Bin 0 -> 23112 bytes network more complicated/client.cpp | 86 ++++++++++++++++++++ network more complicated/server | Bin 0 -> 18768 bytes network more complicated/server.cpp | 117 ++++++++++++++++++++++++++++ network test/Makefile | 19 +++++ network test/client | Bin 0 -> 23560 bytes network test/client.cpp | 94 ++++++++++++++++++++++ network test/server | Bin 0 -> 23808 bytes network test/server.cpp | 114 +++++++++++++++++++++++++++ thread test/Makefile | 21 +++++ thread test/thread | Bin 0 -> 23656 bytes thread test/thread.cpp | 49 ++++++++++++ thread test/threadncurses | Bin 0 -> 23496 bytes thread test/threadncurses.cpp | 90 +++++++++++++++++++++ 19 files changed, 677 insertions(+) create mode 100644 README.md create mode 100644 ncurses test/Makefile create mode 100755 ncurses test/ncursestest create mode 100644 ncurses test/ncursestest.cpp create mode 100644 network more complicated/Makefile create mode 100755 network more complicated/client create mode 100644 network more complicated/client.cpp create mode 100755 network more complicated/server create mode 100644 network more complicated/server.cpp create mode 100644 network test/Makefile create mode 100755 network test/client create mode 100644 network test/client.cpp create mode 100755 network test/server create mode 100644 network test/server.cpp create mode 100644 thread test/Makefile create mode 100755 thread test/thread create mode 100644 thread test/thread.cpp create mode 100755 thread test/threadncurses create mode 100644 thread test/threadncurses.cpp diff --git a/README.md b/README.md new file mode 100644 index 0000000..8c4be5b --- /dev/null +++ b/README.md @@ -0,0 +1,13 @@ +## ncursestest +A basic ncurses proof of concept test + +## network more complicated +A "complicated" network system that allows for ip address and port selection but dosn't use ncurses or have threading + +## network test +A better network test that doesn't allow you to use anything besides address 127.0.0.1 and port 8080 but it features properly implemented threading. The lack of ncurses prevents it from being passable as a client/server chat program because the ui gets out of sync but otherwise it actually works + +## thread test +A basic example of how to use pthread + +further instructions for how to use these programs are in the comments in their respective source code files \ No newline at end of file diff --git a/ncurses test/Makefile b/ncurses test/Makefile new file mode 100644 index 0000000..24bed10 --- /dev/null +++ b/ncurses test/Makefile @@ -0,0 +1,18 @@ +# Compiler and flags +CXX = g++ +CXXFLAGS = -Wall -Wextra -O2 -std=c++17 + +# Linker flags +LDFLAGS = -lcurses + +# Default target +all: ncursestest + +# Build rule +ncursestest: ncursestest.cpp + $(CXX) $(CXXFLAGS) ncursestest.cpp -o ncursestest $(LDFLAGS) + +# Clean build artifacts +clean: + rm -f ncursestest + diff --git a/ncurses test/ncursestest b/ncurses test/ncursestest new file mode 100755 index 0000000000000000000000000000000000000000..b8a5929b1cde4af1f27343aa948ebe9585e09ec6 GIT binary patch literal 17376 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 JJ_Db~{sr0nGZFv* literal 0 HcmV?d00001 diff --git a/ncurses test/ncursestest.cpp b/ncurses test/ncursestest.cpp new file mode 100644 index 0000000..ceea411 --- /dev/null +++ b/ncurses test/ncursestest.cpp @@ -0,0 +1,37 @@ +#include +#include +#include +#include +#include +using namespace std; + +int main() +{ + initscr();//creates stdscr. important step + use_default_colors();//this apparently tells it to use default terminal colors whenever there is no color attribute applied + + printw("Hello World\n"); + printw("Please enter a string: "); + refresh(); + char *arr = new char[1024]; + getstr(arr); + printw("Wow I didn't think you'd type in THAT. You entered: "); + printw(arr); + + start_color(); + init_pair(1,COLOR_RED, COLOR_BLUE); + attron(COLOR_PAIR(1)); + printw("\nThe quick brown fox jumps over the lazy dog\n"); + attroff(COLOR_PAIR(1)); + + mvprintw(17, 7, "BRUUUUUUUUH"); + + move(12,13); + attron(A_STANDOUT | A_UNDERLINE); + mvprintw(15, 3, ""); + attroff(A_STANDOUT | A_UNDERLINE); + mvaddch(4,3, '@'); + refresh(); + getch(); + endwin(); +} diff --git a/network more complicated/Makefile b/network more complicated/Makefile new file mode 100644 index 0000000..076c037 --- /dev/null +++ b/network more complicated/Makefile @@ -0,0 +1,19 @@ +# Compiler and flags +CXX = g++ +CXXFLAGS = -Wall -Wextra -O2 -std=c++17 + +# Targets +all: client server + +# Client build +client: client.cpp + $(CXX) $(CXXFLAGS) client.cpp -o client + +# Server build +server: server.cpp + $(CXX) $(CXXFLAGS) server.cpp -o server + +# Clean build artifacts +clean: + rm -f client server + diff --git a/network more complicated/client b/network more complicated/client new file mode 100755 index 0000000000000000000000000000000000000000..97b22b67f7e92b3454d8805f9b0d0505f3dcdb2f GIT binary patch literal 23112 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 literal 0 HcmV?d00001 diff --git a/network more complicated/client.cpp b/network more complicated/client.cpp new file mode 100644 index 0000000..bd58677 --- /dev/null +++ b/network more complicated/client.cpp @@ -0,0 +1,86 @@ +/*this network test uses more complicated network functionality but doesnt use threads or ncurses. +that means you have to wait for the other end to send a message before getting to write a new message +to run, do ./client.cpp 127.0.0.1 8080 +this one has args +*/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +using namespace std; +//Client side +int main(int argc, char *argv[]) +{ + //we need 2 things: ip address and port number, in that order + if(argc != 3) + { + cerr << "Usage: ip_address port" << endl; exit(0); + } //grab the IP address and port number + char *serverIp = argv[1]; int port = atoi(argv[2]); + //create a message buffer + char msg[1500]; + //setup a socket and connection tools + struct hostent* host = gethostbyname(serverIp); + sockaddr_in sendSockAddr; + bzero((char*)&sendSockAddr, sizeof(sendSockAddr)); + sendSockAddr.sin_family = AF_INET; + sendSockAddr.sin_addr.s_addr = + inet_addr(inet_ntoa(*(struct in_addr*)*host->h_addr_list)); + sendSockAddr.sin_port = htons(port); + int clientSd = socket(AF_INET, SOCK_STREAM, 0); + //try to connect... + int status = connect(clientSd, + (sockaddr*) &sendSockAddr, sizeof(sendSockAddr)); + if(status < 0) + { + cout<<"Error connecting to socket!"<"; + string data; + getline(cin, data); + memset(&msg, 0, sizeof(msg));//clear the buffer + strcpy(msg, data.c_str()); + if(data == "exit") + { + send(clientSd, (char*)&msg, strlen(msg), 0); + break; + } + bytesWritten += send(clientSd, (char*)&msg, strlen(msg), 0); + cout << "Awaiting server response..." << endl; + memset(&msg, 0, sizeof(msg));//clear the buffer + bytesRead += recv(clientSd, (char*)&msg, sizeof(msg), 0); + if(!strcmp(msg, "exit")) + { + cout << "Server has quit the session" << endl; + break; + } + cout << "Server: " << msg << endl; + } + gettimeofday(&end1, NULL); + close(clientSd); + cout << "********Session********" << endl; + cout << "Bytes written: " << bytesWritten << + " Bytes read: " << bytesRead << endl; + cout << "Elapsed time: " << (end1.tv_sec- start1.tv_sec) + << " secs" << endl; + cout << "Connection closed" << endl; + return 0; +} \ No newline at end of file diff --git a/network more complicated/server b/network more complicated/server new file mode 100755 index 0000000000000000000000000000000000000000..900e9da269857cc0683a65656f1e6d77a13ac0a9 GIT binary patch literal 18768 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 auN18xMa{t;yR`nZw^;fV@3W^OR{Rf?j&dge literal 0 HcmV?d00001 diff --git a/network more complicated/server.cpp b/network more complicated/server.cpp new file mode 100644 index 0000000..a0e569f --- /dev/null +++ b/network more complicated/server.cpp @@ -0,0 +1,117 @@ +/*this network test uses more complicated network functionality but doesnt use threads or ncurses. +that means you have to wait for the other end to send a message before getting to write a new message +to run, do ./server.cpp 8080 +this one has args +*/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +using namespace std; +//Server side +int main(int argc, char *argv[]) +{ + //for the server, we only need to specify a port number + if(argc != 2) + { + cerr << "Usage: port" << endl; + exit(0); + } + //grab the port number + int port = atoi(argv[1]); + //buffer to send and receive messages with + char msg[1500]; + + //setup a socket and connection tools + sockaddr_in servAddr; + bzero((char*)&servAddr, sizeof(servAddr)); + servAddr.sin_family = AF_INET; + servAddr.sin_addr.s_addr = htonl(INADDR_ANY); + servAddr.sin_port = htons(port); + + //open stream oriented socket with internet address + //also keep track of the socket descriptor + int serverSd = socket(AF_INET, SOCK_STREAM, 0); + if(serverSd < 0) + { + cerr << "Error establishing the server socket" << endl; + exit(0); + } + //bind the socket to its local address + int bindStatus = bind(serverSd, (struct sockaddr*) &servAddr, + sizeof(servAddr)); + if(bindStatus < 0) + { + cerr << "Error binding socket to local address" << endl; + exit(0); + } + cout << "Waiting for a client to connect..." << endl; + //listen for up to 5 requests at a time + listen(serverSd, 5); + //receive a request from client using accept + //we need a new address to connect with the client + sockaddr_in newSockAddr; + socklen_t newSockAddrSize = sizeof(newSockAddr); + //accept, create a new socket descriptor to + //handle the new connection with client + int newSd = accept(serverSd, (sockaddr *)&newSockAddr, &newSockAddrSize); + if(newSd < 0) + { + cerr << "Error accepting request from client!" << endl; + exit(1); + } + cout << "Connected with client!" << endl; + //lets keep track of the session time + struct timeval start1, end1; + gettimeofday(&start1, NULL); + //also keep track of the amount of data sent as well + int bytesRead, bytesWritten = 0; + while(1) + { + //receive a message from the client (listen) + cout << "Awaiting client response..." << endl; + memset(&msg, 0, sizeof(msg));//clear the buffer + bytesRead += recv(newSd, (char*)&msg, sizeof(msg), 0); + if(!strcmp(msg, "exit")) + { + cout << "Client has quit the session" << endl; + break; + } + cout << "Client: " << msg << endl; + cout << ">"; + string data; + getline(cin, data); + memset(&msg, 0, sizeof(msg)); //clear the buffer + strcpy(msg, data.c_str()); + if(data == "exit") + { + //send to the client that server has closed the connection + send(newSd, (char*)&msg, strlen(msg), 0); + break; + } + //send the message to client + bytesWritten += send(newSd, (char*)&msg, strlen(msg), 0); + } + //we need to close the socket descriptors after we're all done + gettimeofday(&end1, NULL); + close(newSd); + close(serverSd); + cout << "********Session********" << endl; + cout << "Bytes written: " << bytesWritten << " Bytes read: " << bytesRead << endl; + cout << "Elapsed time: " << (end1.tv_sec - start1.tv_sec) + << " secs" << endl; + cout << "Connection closed..." << endl; + return 0; +} \ No newline at end of file diff --git a/network test/Makefile b/network test/Makefile new file mode 100644 index 0000000..076c037 --- /dev/null +++ b/network test/Makefile @@ -0,0 +1,19 @@ +# Compiler and flags +CXX = g++ +CXXFLAGS = -Wall -Wextra -O2 -std=c++17 + +# Targets +all: client server + +# Client build +client: client.cpp + $(CXX) $(CXXFLAGS) client.cpp -o client + +# Server build +server: server.cpp + $(CXX) $(CXXFLAGS) server.cpp -o server + +# Clean build artifacts +clean: + rm -f client server + diff --git a/network test/client b/network test/client new file mode 100755 index 0000000000000000000000000000000000000000..fadc819aa5937476f490c62bf064372cdea8f43c GIT binary patch literal 23560 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 vJ=ipm%W<&Z`TlVZc +#include +#include +#include +#include +#include +#include +#include +#define PORT 8080 +using namespace std; + +#ifdef _WIN32 + /#include ; + void fnsleep(unsigned milliseconds) + { + Sleep(milliseconds); + } + +#else + #include + void fnsleep(unsigned milliseconds) + { + usleep(milliseconds * 1000); + } +#endif + +void checkForNewMsgs(int socket, int valreaded, int otherNum); + +void checkForNewMsgs(int socket, int valreaded, int otherNum) +{ + int valreadOne; + char newBuffer[1024] = {0}; + while (3 == 3 && newBuffer != "exit") + { + for(int i = 0; i < 1024; i++) + { + newBuffer[i] = char(0); + } + valreadOne = read( socket , newBuffer, 1024); + if (newBuffer != "") + { + cout << "Server: "; + printf("%s\n",newBuffer ); + } + } + fnsleep(1000); + +} + +int main(int argc, char const *argv[]) +{ + int sock = 0, valread; + struct sockaddr_in serv_addr; + 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; + } + + 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; + } + string message; + thread t(checkForNewMsgs, sock, valread, 1024); + t.detach(); + while (message != "exit") + { + cout << "> "; + getline(cin, message); + send(sock , message.c_str() , strlen(message.c_str()) , 0 ); + + //printf("Hello message sent\n"); + //valread = read( sock , buffer, 1024); + //printf("%s\n",buffer ); + } + return 0; +} diff --git a/network test/server b/network test/server new file mode 100755 index 0000000000000000000000000000000000000000..95b7882f188b4efd246875245a032d09ebd50fe3 GIT binary patch literal 23808 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 AZ~y=R literal 0 HcmV?d00001 diff --git a/network test/server.cpp b/network test/server.cpp new file mode 100644 index 0000000..950bf8f --- /dev/null +++ b/network test/server.cpp @@ -0,0 +1,114 @@ + +// Server side C/C++ program to demonstrate Socket programming +//this uses threads to allow a server and a client to do network chat stuff over 127.0.0.1:8080. the ui is out of sync because it doesn't use ncurses but the message sending and printing part still works +#include +#include +#include +#include +#include +#include +#include +#include +using namespace std; +#define PORT 8080 + +#ifdef _WIN32 + /#include ; + void fnsleep(unsigned milliseconds) + { + Sleep(milliseconds); + } + +#else + #include + void fnsleep(unsigned milliseconds) + { + usleep(milliseconds * 1000); + } +#endif + +void checkForNewMsgs(int socket, int valreaded, int otherNum); + +void checkForNewMsgs(int socket, int valreaded, int otherNum) +{ + int valreadOne; + char newBuffer[1024] = {0}; + while (3 == 3 && newBuffer != "exit") + { + //printf("Client: "); + for(int i = 0; i < 1024; i++) + { + newBuffer[i] = char(0); + } + valreadOne = read( socket , newBuffer, 1024); + if (newBuffer != "") + { + printf("Client: "); + printf("%s\n",newBuffer ); + } + } + fnsleep(1000); + +} + +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 + 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); + } + + string message; + thread t(checkForNewMsgs, new_socket, valread, 1024); + t.detach(); + while (message != "exit") + { + //string message; + cout << "> "; + getline(cin, message); + //valread = read( new_socket , buffer, 1024); + //printf("%s\n",buffer ); + send(new_socket , message.c_str() , strlen(message.c_str()) , 0 ); + //cout << "Hello message sent" << endl; + } + return 0; +} diff --git a/thread test/Makefile b/thread test/Makefile new file mode 100644 index 0000000..70ea492 --- /dev/null +++ b/thread test/Makefile @@ -0,0 +1,21 @@ +# Compiler and flags +CXX = g++ +CXXFLAGS = -pthread -Wall -Wextra -O2 -std=c++17 + +# Linker flags +LDFLAGS = -lcurses + +# Default target +all: thread threadncurses + +# Build rule +thread: thread.cpp + $(CXX) $(CXXFLAGS) thread.cpp -o thread $(LDFLAGS) + +threadncurses: threadncurses.cpp + $(CXX) $(CXXFLAGS) threadncurses.cpp -o threadncurses $(LDFLAGS) + +# Clean build artifacts +clean: + rm -f thread threadncurses + diff --git a/thread test/thread b/thread test/thread new file mode 100755 index 0000000000000000000000000000000000000000..912770b23a4913517c2597cb4dadbf941b1d61c2 GIT binary patch literal 23656 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 +#include +#include +#include +using namespace std; + +#ifdef _WIN32 + //this part has never been tested and is unlikely to work + #include ; + void fnsleep(unsigned milliseconds) + { + Sleep(milliseconds); + } + +#else + #include + void fnsleep(unsigned milliseconds) + { + usleep(milliseconds * 1000); + } +#endif + +void helloWorld(int y) +{ + for (int i = 0; i < 10; i++) + { + //a terrible, awful way of getting linux terminal text colors without ncurses. + cout << "\033[1;31mbold red text\033[0m\n"; + cout << "\x1B[32mAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\x1B[0m\n"; + cout << "Hello world #" << i + 1 << endl; + fnsleep(1000); + } +} + +int main() +{ + thread thread_object(helloWorld, 1); + cout << "This string gets printed after running the hello world function but prints BEFORE helloworld prints. That means this program uses threads" << endl; + //use detach to make the thread run asychronoussly. use join to WAIT HERE until its finished. Try it out! (i tested both cases and it works on my machine) + //thread_object.detach(); + thread_object.join(); + cout << "Please enter your name: " << endl; + string name; + cin >> name; + cout << name << " is a [redacted for academic purposes]" << endl; + return 0; +} \ No newline at end of file diff --git a/thread test/threadncurses b/thread test/threadncurses new file mode 100755 index 0000000000000000000000000000000000000000..611b0eb68ca1a43fef6650243cc82121c3effeac GIT binary patch literal 23496 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 l4lM6G;`* +#include +#include +#include +#include +using namespace std; + +#ifdef _WIN32 + //this part has never been tested and is unlikely to work + #include ; + void fnsleep(unsigned milliseconds) + { + Sleep(milliseconds); + } + +#else + #include + void fnsleep(unsigned milliseconds) + { + usleep(milliseconds * 1000); + } +#endif + +void helloWorld(int y) +{ + for (int i = 0; i < 10; i++) + { + //store the cursor positions here + int y, x; + int yy, xx; + int xBefore; + int yBefore; + start_color(); + init_pair(1, COLOR_RED, COLOR_BLUE); + if (i != 0) + { + //print the hello world lines + getyx(stdscr, yBefore, xBefore); + move(2, 0); + clrtoeol(); + mvprintw(2, 0, "Hello world #"); + int icantthinkofanameforthis = i + 1; + printw(to_string(icantthinkofanameforthis).c_str());//an annoying but reliable way to get this to work + printw("\n"); + move(yBefore, xBefore); //move the cursor back to where is was before to allow for a fluid typing experience (i.e. its possible to mess this part up if you do it wrong) + } + else + { + attron(COLOR_PAIR(1)); + attron(A_BOLD); + getyx(stdscr, yy, xx); + printw("bold red text\n"); + attroff(COLOR_PAIR(1)); + printw("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"); + attroff(A_BOLD); + printw("Hello world #"); + int icantthinkofanameforthis = i + 1; + printw(to_string(icantthinkofanameforthis).c_str());//an annoying but reliable way to get this to work + printw("\n"); + move(3, 25); //the default text-entry position + } + + refresh(); + fnsleep(1000); + } +} + +int main() +{ + initscr(); + use_default_colors(); + move(3, 0); + printw("Please enter your name: \n"); + move(0, 0); + + thread thread_object(helloWorld, 1); + thread_object.detach(); + + char *name = new char[99]; + getstr(name); + printw(name); + printw(" is a [redacted for academic purposes]\n"); + printw("Press any key to continue"); + getch(); + endwin(); + return 0; +} \ No newline at end of file