/*
__ _____ _______ __ _____ ____ ___ ___
/ |/ / / / / ___// / / /__ \ / __ \__ \< /
/ /|_/ / / / /\__ \/ /_/ /__/ // / / /_/ // /
/ / / / /_/ /___/ / __ // __// /_/ / __// /
/_/ /_/\____//____/_/ /_//____/\____/____/_/
Copyright (C) 2021 MatCat
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#include
#include
#include
#include
#include
#include
#include
#include "socketserver.hpp"
using namespace std;
/*
__ ________ __ ___ __
/ / / _/ __ )/ / / / | / /
/ / / // __ / / / /| | / /
/ /____/ // /_/ / /_/ / | |/ /
/_____/___/_____/\____/ |___/
_________________________________________________________________________________________________
/ ↓ ↓ ↓ ↓ ↓ ↓ \
*/
uv_loop_t *loop;
uv_tcp_t server;
void alloc_buffer(uv_handle_t *handle, size_t suggested_size, uv_buf_t *buf) {
buf->base = (char*) malloc(suggested_size);
buf->len = suggested_size;
}
int setupSocketServer() {
loop = uv_default_loop();
uv_tcp_init(loop, &server);
struct sockaddr_in bind_addr;
uv_ip4_addr("0.0.0.0", 1701, &bind_addr);
uv_tcp_bind(&server, (const struct sockaddr*)&bind_addr, 0);
int r = uv_listen((uv_stream_t*) &server, 512, on_new_connection);
if (r) {
fprintf(stderr, "ERROR Could not bind to host and port!\n");
return 1;
}
return uv_run(loop, UV_RUN_DEFAULT);
}
void client_write(uv_write_t *req, int status) {
if (status == -1) {
fprintf(stderr, "Write error!\n");
}
char *base = (char*) req->data;
free(base);
free(req);
}
void send_Message(uv_stream_t* client, char* msg) {
uv_buf_t outbuf = uv_buf_init(msg, strlen(msg));
uv_write_t *outreq = (uv_write_t *) malloc(sizeof(uv_write_t));
uv_write(outreq, (uv_stream_t *) client, &outbuf, 1, client_write);
}
void client_read(uv_stream_t *client, ssize_t nread, const uv_buf_t *buf) {
if (nread == -1) {
fprintf(stderr, "Read error!\n");
uv_close((uv_handle_t*)client, (uv_close_cb) free);
return;
}
printf("Got %d bytes\n%s",nread,buf->base);
if (nread > 0) {
if (buf->base[0] == '@') {
string baseString = buf->base;
string Command = baseString.substr(0,baseString.find(" "));
string ogCommand = Command;
transform(Command.begin(), Command.end(), Command.begin(), ::tolower);
Command.erase( remove(Command.begin(), Command.end(), '\r'), Command.end() );
Command.erase( remove(Command.begin(), Command.end(), '\n'), Command.end() );
printf("It's a command: %s\n",Command.c_str());
if (Command == "@help") {
send_Message(client,(char *)"There is no help for you!\n");
printf("User wants help!\n");
}
if (Command == "@quit") {
send_Message(client,(char *)"Bye!\n");
uv_close((uv_handle_t*) client,(uv_close_cb) free);
}
}
}
if (nread <= 0) {
printf("Read error %s\n",uv_err_name(nread));
uv_close((uv_handle_t*) client, (uv_close_cb) free);
return;
}
}
void on_new_connection(uv_stream_t *server, int status) {
if (status == -1) {
return;
}
uv_tcp_t *client = (uv_tcp_t*) malloc(sizeof(uv_tcp_t));
uv_tcp_init(loop, client);
if (uv_accept(server, (uv_stream_t*) client) == 0) {
printf("New Connection\n");
uv_read_start((uv_stream_t*) client, alloc_buffer, client_read);
send_Message((uv_stream_t*) client,(char *)"Welcome!\n");
}
else {
uv_close((uv_handle_t*) client, (uv_close_cb) free);
printf("Dropping connection\n");
}
}
/*
\________↑_______________↑_______________↑_______________↑_______________↑_______________↑________/
END OF SECTION: LIBUV /
________________________________________________________________________________________________/
*/