From 19cf86793311c1cd7dd1d13a253487be7c2ab1f7 Mon Sep 17 00:00:00 2001 From: Pentium44 Date: Wed, 7 Apr 2021 03:43:36 -0700 Subject: [PATCH] More work on networking sockets --- examples/net-connect.ss | 13 +++ examples/net-listen.ss | 7 ++ test.ss => examples/test.ss | 0 src/deps.h | 12 ++- src/functions.c | 60 +++++++++++--- src/network.c | 154 +++++++++++++----------------------- src/network.h | 8 +- 7 files changed, 137 insertions(+), 117 deletions(-) create mode 100755 examples/net-connect.ss create mode 100755 examples/net-listen.ss rename test.ss => examples/test.ss (100%) diff --git a/examples/net-connect.ss b/examples/net-connect.ss new file mode 100755 index 0000000..5559ac7 --- /dev/null +++ b/examples/net-connect.ss @@ -0,0 +1,13 @@ +#!/usr/bin/slidescript + +address=127.0.0.1 +port=2001 +data1=This data is gonna be pushed to the server side host! +data2=Here's the second set of data getting tossed to the server +data3=Of course, do a little more considering the transfer is instant! + +nettoss "%address%" "%port%" "%data1%" +nettoss "%address%" "%port%" "%data2%" +nettoss "%address%" "%port%" "%data3%" + +nettoss "%address%" "%port%" "hi" diff --git a/examples/net-listen.ss b/examples/net-listen.ss new file mode 100755 index 0000000..e19aade --- /dev/null +++ b/examples/net-listen.ss @@ -0,0 +1,7 @@ +#!/usr/bin/slidescript + +port=2001 +search=hi +respond=bye + +netlisten "%port%" "%search%" "%respond%" diff --git a/test.ss b/examples/test.ss similarity index 100% rename from test.ss rename to examples/test.ss diff --git a/src/deps.h b/src/deps.h index 36f5e87..43f1526 100644 --- a/src/deps.h +++ b/src/deps.h @@ -16,12 +16,20 @@ #define MAX_VAR_NAME_LEN 128 #define MAX_VAR_NAME_BUFSIZE (MAX_VAR_NAME_LEN + 1) -#define MAX_STRING_LEN 2048 +#define MAX_STRING_LEN 4096 #define MAX_STRING_BUFSIZE (MAX_STRING_LEN + 1) -#define MAX_VAR_DATA_LEN 2048 +#define MAX_VAR_DATA_LEN 4096 #define MAXVARS 2048 #define MAX_CONCAT_BUF 2048 #define MAX_READFILE_LEN 2097152 +// for networking functions +#define MAX_ADDRESS_LEN 256 +#define MAX_ADDRESS_BUF (MAX_ADDRESS_LEN + 1) +#define MAX_NETSRCH_LEN 1024 +#define MAX_NETSRCH_BUF (MAX_NETSRCH_LEN + 1) +#define MAX_NETRESP_LEN 3068 +#define MAX_NETRESP_BUF (MAX_NETRESP_BUF + 1) +// END #define TOKEN '%' #define TOKEN_STR "%" #define NULLBYTE '\0' diff --git a/src/functions.c b/src/functions.c index 26e797f..4d2867c 100644 --- a/src/functions.c +++ b/src/functions.c @@ -73,25 +73,51 @@ char *process_line(char *line) /* Networking, listen */ else if(strncmp("netlisten",tok_srch,9) == 0) { - tok_srch = strtok(NULL, " "); + char srch[MAX_NETSRCH_BUF]; + char port[7]; // Should never be more than 6 characters + tok_srch = strtok(NULL, "\""); if(strcmp(tok_srch, "\n") == 0 || strcmp(tok_srch, " \n") == 0 || tok_srch == NULL) syn_error("ss:error:sleep syntax error, need trailing integer for operation"); - /* if there is a new line, remove it */ - if(tok_srch[strlen(tok_srch)-1] == '\n') + if(strlen(parse_vars(tok_srch)) < 7) { - tok_srch[strlen(tok_srch)-1] = 0; + strcpy(port, parse_vars(tok_srch)); } - snet_listen(atoi(parse_vars(tok_srch))); + else + { + syn_error("ss:error:network listen port too long"); + } + + /* strtok to the content that will be written to file */ + tok_srch = strtok(NULL, "\""); + tok_srch = strtok(NULL, "\""); + if(strcmp(tok_srch, "\n") == 0 || strcmp(tok_srch, " \n") == 0 || tok_srch == NULL) { + syn_error("ss:error:netconnect syntax error on data entry (are you quoted?)"); + } + + strcpy(srch, parse_vars(tok_srch)); + + /* strtok to the socket response */ + tok_srch = strtok(NULL, "\""); + tok_srch = strtok(NULL, "\""); + if(strcmp(tok_srch, "\n") == 0 || strcmp(tok_srch, " \n") == 0 || tok_srch == NULL) { + syn_error("ss:error:netconnect syntax error on data entry (are you quoted?)"); + } + + if(strtok(NULL, "\"") == NULL) + syn_error("ss:error:netconnect syntax error, missing end quote"); + + snet_listen(atoi(port), srch, parse_vars(tok_srch)); return NULL; } /* Networking, connect */ - else if(strncmp("netconnect",tok_srch,10) == 0) + else if(strncmp("nettoss",tok_srch,10) == 0) { - char address[128]; - char *port; + char address[MAX_ADDRESS_BUF]; + char data[MAX_STRING_BUFSIZE]; + char port[7]; /* strtok to filename of function */ tok_srch = strtok(NULL, "\""); /* Check to see if syntax is correct */ @@ -110,12 +136,24 @@ char *process_line(char *line) syn_error("ss:error:netconnect syntax error on data entry (are you quoted?)"); } + if(strlen(parse_vars(tok_srch)) > 6) + syn_error("ss:error:nettoss port too long"); + + strcpy(port, parse_vars(tok_srch)); + + tok_srch = strtok(NULL, "\""); + tok_srch = strtok(NULL, "\""); + if(strcmp(tok_srch, "\n") == 0 || + strcmp(tok_srch, " \n") == 0 || tok_srch == NULL) { + syn_error("ss:error:netconnect syntax error on data entry (are you quoted?)"); + } + if(strtok(NULL, "\"") == NULL) syn_error("ss:error:netconnect syntax error, missing end quote"); + + strcpy(data, parse_vars(tok_srch)); - port = parse_vars(tok_srch); - printf("%s:%s", address, port); - snet_connect(address, atoi(port)); + snet_toss(address, atoi(port), data); return NULL; } diff --git a/src/network.c b/src/network.c index ea0f4da..d300ee6 100644 --- a/src/network.c +++ b/src/network.c @@ -7,58 +7,50 @@ #include "deps.h" #include "network.h" +#include "util.h" -void snet_bind(int sockfd) +void snet_bind(int sockfd, char *srch, char *resp) { - char buff[MAX_STRING_BUFSIZE]; - int n, rr, wr; - // infinite loop for chat - for (;;) + char buff[MAX_STRING_BUFSIZE+1]; + int rr, wr; + //bzero(buff, MAX_STRING_BUFSIZE); + // read the message from client and copy it in buffer + rr = read(sockfd, buff, sizeof(buff)); + + if(rr == -1) syn_error("ss:net:error client read error"); + + // print buffer which contains the client contents + printf("ss:net: %s\n", buff); + bzero(buff, MAX_STRING_BUFSIZE); + // if msg contains "Exit" then server exit and chat ended. + if (strncmp("exit", buff, 4) == 0) { - bzero(buff, MAX_STRING_BUFSIZE); - - // read the message from client and copy it in buffer - rr = read(sockfd, buff, sizeof(buff)); + syn_error("ss:net:call to exit"); + } - if(rr == -1) break; - - // print buffer which contains the client contents - printf("From client: %s\t To client : ", buff); - bzero(buff, MAX_STRING_BUFSIZE); - n = 0; - // copy server message in the buffer - while ((buff[n++] = getchar()) != '\n') - ; - - // and send that buffer to client - wr = write(sockfd, buff, sizeof(buff)); - - if(wr == -1) break; - - // if msg contains "Exit" then server exit and chat ended. - if (strncmp("exit", buff, 4) == 0) - { - printf("Server Exit...\n"); - break; - } + if (strncmp(srch, buff, strlen(srch)) == 0) + { + wr = write(sockfd, resp, sizeof(resp)); + if(wr == -1) syn_error("ss:error:network write error!"); + } + else + { + wr = write(sockfd, resp, sizeof(resp)); + if(wr == -1) syn_error("ss:error:network write error!"); } } -void snet_listen(int port) +void snet_listen(int port, char *srch, char *resp) { - int sockfd, connfd; + int sockfd, connfd, length; struct sockaddr_in servaddr; + struct sockaddr_in cliaddr; // socket create and verification sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd == -1) { - printf("socket creation failed...\n"); - exit(0); - } - else - { - printf("Socket successfully created..\n"); + syn_error("ss:error:network socket creation failed"); } bzero(&servaddr, sizeof(servaddr)); @@ -69,76 +61,44 @@ void snet_listen(int port) servaddr.sin_port = htons(port); // Binding newly created socket to given IP and verification - if ((bind(sockfd, (SA*)&servaddr, sizeof(servaddr))) != 0) + if ((bind(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr))) != 0) { - printf("socket bind failed...\n"); - exit(0); - } - else - { - printf("Socket successfully binded..\n"); + syn_error("ss:error:network bind failed"); } // Now server is ready to listen and verification - if ((listen(sockfd, 10)) != 0) + if ((listen(sockfd, 64)) != 0) { - printf("Listen failed...\n"); - exit(0); + syn_error("ss:error:network listen failed"); } else { - printf("Server listening..\n"); + printf("Listening on '%d'\n", port); } - // Accept the data packet from client and verification - connfd = accept(sockfd, (SA*)NULL, NULL); - if (connfd < 0) - { - printf("server acccept failed...\n"); - exit(0); - } - else - { - printf("server acccept the client...\n"); + for( ; ; ) { + length = sizeof(cliaddr); + // Accept the data packet from client and verification + if((connfd = accept(sockfd, (struct sockaddr*)&cliaddr, (socklen_t*) &length)) < 0) + { + syn_error("ss:error:network accept failed"); + } + + snet_bind(connfd, srch, resp); } - // Function for chatting between client and server - snet_bind(connfd); - // After chatting close the socket close(sockfd); } -void snet_serv_bind(int sockfd) +void snet_serv_toss(int sockfd, char *string) { - char buff[MAX_STRING_BUFSIZE]; - int n, rr, wr; - - for (;;) - { - bzero(buff, sizeof(buff)); - printf("Enter the string : "); - n = 0; - while ((buff[n++] = getchar()) != '\n') - ; - - wr = write(sockfd, buff, sizeof(buff)); - if(wr == -1) break; - - bzero(buff, sizeof(buff)); - - rr = read(sockfd, buff, sizeof(buff)); - if(rr == -1) break; - - printf("From Server : %s", buff); - if ((strncmp(buff, "exit", 4)) == 0) { - printf("Client Exit...\n"); - break; - } - } + int wr; + wr = write(sockfd, string, strlen(string)); + if(wr == -1) syn_error("ss:net:socket write error!"); } -void snet_connect(char *address, int port) +void snet_toss(char *address, int port, char *string) { int sockfd; struct sockaddr_in servaddr; @@ -147,12 +107,7 @@ void snet_connect(char *address, int port) sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd == -1) { - printf("socket creation failed...\n"); - exit(0); - } - else - { - printf("Socket successfully created..\n"); + syn_error("ss:error:network failed to create socket"); } bzero(&servaddr, sizeof(servaddr)); @@ -163,18 +118,17 @@ void snet_connect(char *address, int port) servaddr.sin_port = htons(port); // connect the client socket to server socket - if (connect(sockfd, (SA*)&servaddr, sizeof(servaddr)) != 0) + if (connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) != 0) { - printf("connection with the server failed...\n"); - exit(0); + syn_error("ss:error:network failled to connect"); } else { - printf("connected to the server..\n"); + printf("ss:net:connecting to %s pm %d\n", address, port); } // function for chat - snet_serv_bind(sockfd); + snet_serv_toss(sockfd, string); // close the socket close(sockfd); diff --git a/src/network.h b/src/network.h index d264b4c..bc76ff1 100644 --- a/src/network.h +++ b/src/network.h @@ -8,7 +8,7 @@ #define SA struct sockaddr -void snet_bind(int sockfd); -void snet_listen(int port); -void snet_serv_bind(int sockfd); -void snet_connect(char *address, int port); +void snet_bind(int sockfd, char *srch, char *resp); +void snet_listen(int port, char *srch, char *resp); +void snet_serv_bind(int sockfd, char *string); +void snet_toss(char *address, int port, char *string);