Added some msg functions for handling sockets
This commit is contained in:
parent
fc2d926330
commit
7aea4c126d
6 changed files with 85 additions and 57 deletions
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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); }
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue