aboutsummaryrefslogtreecommitdiff
path: root/net.c
diff options
context:
space:
mode:
authorame <[email protected]>2024-01-16 21:38:29 -0600
committerame <[email protected]>2024-01-16 21:38:29 -0600
commitd9fd2e78c572fe4644d48234615083a08318cf31 (patch)
treed615393c15c553617f5d038622ec1cec461a645a /net.c
parent8582794ad694c7ca3e53f875a3ce41f0231a5dd4 (diff)
starting net stuff
Diffstat (limited to 'net.c')
-rw-r--r--net.c136
1 files changed, 136 insertions, 0 deletions
diff --git a/net.c b/net.c
new file mode 100644
index 0000000..b111adb
--- /dev/null
+++ b/net.c
@@ -0,0 +1,136 @@
+#include <sys/socket.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <arpa/inet.h>
+#include <pthread.h>
+#include <string.h>
+
+#include "src/i_str.h"
+
+#define max_con 10
+#define BUFFER_SIZE 2048
+
+size_t recv_full_buffer(int client_fd, char** _buffer, int* header_eof){
+ char* buffer = malloc(BUFFER_SIZE * sizeof * buffer);
+ char* header;
+ size_t len = 0;
+ *header_eof = -1;
+ int n;
+
+ for(;;){
+ n = recv(client_fd, buffer + len, BUFFER_SIZE, 0);
+ if(*header_eof == -1 && (header = strstr(buffer, "\r\n\r\n")) != NULL){
+ *header_eof = header - buffer;
+ }
+ if(n != BUFFER_SIZE) break;
+ len += BUFFER_SIZE;
+ buffer = realloc(buffer, len + BUFFER_SIZE);
+ }
+
+ *_buffer = buffer;
+ return len + BUFFER_SIZE;
+}
+
+void parse_header(char* buffer, int header_eof, str*** _table, int* _len){
+ char add[] = {0,0};
+ int lines = 3;
+ for(int i = 0; i != header_eof; i++) lines += buffer[i] == '\n';
+ str** table = malloc(sizeof ** table * lines * 2);
+ table[0] = str_init("Request");// table[1] = str_init("Post|Get");
+ table[2] = str_init("Path");// table[3] = str_init("/");
+ table[4] = str_init("Version");// table[5] = str_init("HTTP/1.1");
+ str* current = str_init("");
+ int ins = 1;
+ for(int i = 0; i != header_eof; i++){
+ add[0] = buffer[i];
+ if(buffer[i] == '\n') break;
+ if(buffer[i] == ' '){
+ table[ins] = str_init(current->c);
+ ins += 2;
+ str_clear(current);
+ } else str_push(current, add);
+ }
+ table[ins] = str_init(current->c);
+
+ int tlen = 6;
+
+ int key = 1;
+ for(int i = (strstr(buffer,"\n") - buffer) + 1; i != header_eof; i++){
+ if(key && buffer[i]==':' || !key && buffer[i]=='\n') {
+ table[tlen] = str_init(current->c);
+ str_clear(current);
+ tlen++;
+ key = !key;
+ i++;
+ continue;
+ }
+ add[0] = buffer[i];
+ str_push(current, add);
+ }
+ table[tlen] = str_init(current->c);
+ tlen++;
+ str_free(current);
+ *_len = tlen / 2;
+ *_table = table;
+}
+
+void* handle_client(void *arg){
+ int client_fd = *((int*)arg);
+ char* buffer;
+ int header_eof;
+ size_t bytes_received = recv_full_buffer(client_fd, &buffer, &header_eof);
+
+ if(bytes_received > 0){
+ /*str** table;
+ int len;
+ parse_header(buffer, header_eof, &table, &len);
+
+ printf("%i\n",len);
+ for(int i = 0; i != len * 2; i+=2){
+ printf("%s :: %s\n",table[i]->c, table[i+1]->c);
+ }*/
+
+ }
+ free(buffer);
+ return NULL;
+}
+
+int main(){
+ int server_fd;
+ struct sockaddr_in server_addr;
+
+ if((server_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
+ printf("error\n");
+ abort();
+ }
+
+ server_addr.sin_family = AF_INET;
+ server_addr.sin_addr.s_addr = INADDR_ANY;
+ server_addr.sin_port = htons(3041);
+
+ if(bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0){
+ printf("failed to bind\n");
+ abort();
+ }
+
+ if(listen(server_fd, max_con) < 0){
+ printf("failed to listen\n");
+ abort();
+ }
+
+ for(;;){
+ struct sockaddr_in client_addr;
+ socklen_t client_addr_len = sizeof(client_addr);
+ int* client_fd = malloc(sizeof(int));
+
+ if((*client_fd = accept(server_fd, (struct sockaddr*)&client_addr, &client_addr_len)) < 0){
+ printf("failed to accept\n");
+ abort();
+ }
+
+ pthread_t thread_id;
+ pthread_create(&thread_id, NULL, handle_client, (void*)client_fd);
+ pthread_detach(thread_id);
+ }
+
+}