Added some msg functions for handling sockets

This commit is contained in:
Warwick 2023-07-28 16:23:21 +01:00
parent fc2d926330
commit 7aea4c126d
6 changed files with 85 additions and 57 deletions

View file

@ -30,7 +30,7 @@ int main(int argc, char *argv[]) {
char msgbuffer[255]; char msgbuffer[255];
if (argc < 2) { if (argc < 2) {
error_crash("Not enough server info has been provided"); err__crash("Not enough server info has been provided");
} }
if (argc > 2) { if (argc > 2) {
@ -42,11 +42,11 @@ int main(int argc, char *argv[]) {
// Create socket // Create socket
sockfd = socket(AF_INET, SOCK_STREAM, 0); sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) if (sockfd < 0)
error_crash("Can't open socket."); err__crash("Can't open socket.");
server = gethostbyname(argv[1]); server = gethostbyname(argv[1]);
if (server == NULL) if (server == NULL)
error_crash("No such host exists :("); err__crash("No such host exists :(");
serv_addr.sin_family = AF_INET; serv_addr.sin_family = AF_INET;
bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr,
@ -54,19 +54,19 @@ int main(int argc, char *argv[]) {
serv_addr.sin_port = htons(portno); serv_addr.sin_port = htons(portno);
errflag = connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)); errflag = connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
if (errflag < 0) if (errflag < 0)
error_crash("Failed to connect to host"); err__crash("Failed to connect to host");
while (1) { while (1) {
bzero(msgbuffer, sizeof msgbuffer); bzero(msgbuffer, sizeof msgbuffer);
fgets(msgbuffer, sizeof msgbuffer, stdin); fgets(msgbuffer, sizeof msgbuffer, stdin);
errflag = write(sockfd, msgbuffer, strlen(msgbuffer)); errflag = write(sockfd, msgbuffer, strlen(msgbuffer));
if (errflag < 0) if (errflag < 0)
error_crash("Failed to write message"); err__crash("Failed to write message");
bzero(msgbuffer, sizeof msgbuffer); bzero(msgbuffer, sizeof msgbuffer);
errflag = read(sockfd, msgbuffer, sizeof msgbuffer); errflag = read(sockfd, msgbuffer, sizeof msgbuffer);
if (errflag < 0) if (errflag < 0)
error_crash("Failed to read message"); err__crash("Failed to read message");
printf("Server: %s", msgbuffer); printf("Server: %s", msgbuffer);

View file

@ -13,10 +13,9 @@
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
int a = 1; int a = 1;
msg_amsg_test(a);
// Set up containers for file descriptor id's // Set up containers for file descriptor id's
int sockfd, clientsockfd, portno, errflag; int serv_sockfd, cli_sockfd, portno, errflag;
char msgbuffer[255]; char msgbuffer[255];
// Set port number. // Set port number.
@ -32,46 +31,18 @@ int main(int argc, char *argv[]) {
// touched until it's used // touched until it's used
// Create socket // Create socket
sockfd = socket(AF_INET, SOCK_STREAM, 0); serv_sockfd = msg__create_serv_connection(portno);
if (sockfd < 0) {
error_crash("Can't open socket.");
}
// Make sure there is no junk data in serve_addr // Accept connection
bzero((char *)&serv_addr, sizeof serv_addr); cli_sockfd = msg__accept_cli_connection(serv_sockfd);
// Tell the connection to use ipv4 and port number
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
// Bind Socket
errflag = bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
if (errflag < 0) {
error_crash("Can't bind socket");
}
errflag = listen(sockfd, 5);
if (errflag < 0) {
error_crash("Can't listen for connections");
}
char portstr[5]; // Buffer to store string version of port
snprintf(portstr, sizeof portstr, "%d", portno);
printf("Server Listening on port: %s\n", portstr);
clientsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen);
if (clientsockfd < 0) {
error_crash("Can't accept connection");
}
while (1) { while (1) {
// Empty message buffer // Empty message buffer
bzero(msgbuffer, sizeof msgbuffer); bzero(msgbuffer, sizeof msgbuffer);
errflag = read(clientsockfd, msgbuffer, sizeof msgbuffer); errflag = read(cli_sockfd, msgbuffer, sizeof msgbuffer);
if (errflag < 0) { if (errflag < 0) {
error_crash("Didn't recieve message from connection"); err__crash("Didn't recieve message from connection");
} }
printf("Client: %s\n", msgbuffer); printf("Client: %s\n", msgbuffer);
@ -79,9 +50,9 @@ int main(int argc, char *argv[]) {
bzero(msgbuffer, sizeof msgbuffer); bzero(msgbuffer, sizeof msgbuffer);
fgets(msgbuffer, sizeof msgbuffer, stdin); fgets(msgbuffer, sizeof msgbuffer, stdin);
errflag = write(clientsockfd, msgbuffer, strlen(msgbuffer)); errflag = write(cli_sockfd, msgbuffer, strlen(msgbuffer));
if (errflag < 0) { if (errflag < 0) {
error_crash("Couldn't write response message"); err__crash("Couldn't write response message");
} }
int cmp = strncmp("Bye", msgbuffer, 3); int cmp = strncmp("Bye", msgbuffer, 3);
@ -89,8 +60,8 @@ int main(int argc, char *argv[]) {
break; break;
} }
close(clientsockfd); msg__destroy_connection(cli_sockfd);
close(sockfd); msg__destroy_connection(serv_sockfd);
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }

View file

@ -4,8 +4,8 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
void error_crash(const char *msg); void err__crash(const char *msg);
void error_warn(const char *msg); void err__warn(const char *msg);
void error_log(const char *msg); void err__log(const char *msg);

View file

@ -1,15 +1,21 @@
#pragma once #pragma once
#include "error.h" #include "error.h"
#include <netinet/in.h> //sockaddr_in
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <sys/socket.h> // sockaddr
#include <sys/types.h>
void msg_amsg_test(int a); void msg__amsg_test(int a);
// Creates a socket set's it up to listen to listen on the specified port and // Creates a socket set's it up to listen to listen on the specified port and
// returns the file descriptor // returns the file descriptor
int msg_create_serv_connection(int portno); int msg__create_serv_connection(int portno);
// Closes socket connection
void msg__destroy_connection(int sockfd);
// Creates a socket for the client and returns the file descriptor // Creates a socket for the client and returns the file descriptor
int msg_accept_cli_connection(); int msg__accept_cli_connection(int server_sockfd);

View file

@ -2,12 +2,12 @@
#include "protobuf_gen/amessage.pb-c.h" #include "protobuf_gen/amessage.pb-c.h"
#define MAX_MSG_SIZE 1024 #define MAX_MSG_SIZE 1024
void error_crash(const char *msg) { void err__crash(const char *msg) {
fprintf(stderr, "error crash: %s\n", msg); fprintf(stderr, "error crash: %s\n", msg);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
void error_warn(const char *msg) { fprintf(stderr, "warning: %s\n", msg); } void err__warn(const char *msg) { fprintf(stderr, "warning: %s\n", msg); }
// TODO: Save the logs somewhere // TODO: Save the logs somewhere
void error_log(const char *msg) { fprintf(stderr, "log: %s\n", msg); } void err__log(const char *msg) { fprintf(stderr, "log: %s\n", msg); }

View file

@ -1,8 +1,9 @@
#include "message.h" #include "message.h"
#define MAX_MSG_SIZE 1024
#include "protobuf_gen/amessage.pb-c.h" #include "protobuf_gen/amessage.pb-c.h"
void msg_amsg_test(int a) { #define MAX_MSG_SIZE 1024
void msg__amsg_test(int a) {
AMessage msg = AMESSAGE__INIT; // The massage format AMessage msg = AMESSAGE__INIT; // The massage format
void *buf; // Buffer to store serialized data void *buf; // Buffer to store serialized data
unsigned len; // length of serialized data unsigned len; // length of serialized data
@ -28,7 +29,7 @@ void msg_amsg_test(int a) {
msg2 = amessage__unpack(NULL, msg_len, buf2); msg2 = amessage__unpack(NULL, msg_len, buf2);
if (msg2 == NULL) { if (msg2 == NULL) {
error_crash("error unpacking incoming message\n"); err__crash("error unpacking incoming message\n");
} }
// display the message's fields. // display the message's fields.
@ -40,3 +41,53 @@ void msg_amsg_test(int a) {
// Free the unpacked message // Free the unpacked message
amessage__free_unpacked(msg2, NULL); amessage__free_unpacked(msg2, NULL);
} }
int msg__create_serv_connection(int portno) {
int sockfd, clientsockfd, errflag;
struct sockaddr_in serv_addr;
// Create socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
err__crash("Can't open socket.");
}
// Make sure there is no junk data in serve_addr
bzero((char *)&serv_addr, sizeof serv_addr);
// Tell the connection to use ipv4 and port number
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
// Bind Socket
errflag = bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
if (errflag < 0) {
err__crash("Can't bind socket");
}
errflag = listen(sockfd, 5);
if (errflag < 0) {
err__crash("Can't listen for connections");
}
char successmsg[80]; // Buffer for success message
snprintf(successmsg, sizeof successmsg, "Server funning on port: %d", portno);
err__log(successmsg);
return sockfd;
}
void msg__destroy_connection(int sockfd) { close(sockfd); }
int msg__accept_cli_connection(int server_sockfd) {
struct sockaddr_in cli_addr;
socklen_t clilen = sizeof cli_addr;
int cli_sockfd = accept(server_sockfd, (struct sockaddr *)&cli_addr, &clilen);
if (cli_sockfd < 0) {
err__crash("Can't accept connection");
}
return cli_sockfd;
}