Added separate file for helper functions.

master
Aadhavan Srinivasan 2 years ago
parent 0b21444fc3
commit b5c5db9117

@ -0,0 +1,83 @@
#include "easysock.h"
int create_socket(int network, char transport) {
int domain;
int type;
if (network == 4) {
domain = AF_INET;
} else if (network == 6) {
domain = AF_INET6;
} else {
return -1;
}
if (transport == 'T') {
type = SOCK_STREAM;
} else if (transport == 'U') {
type = SOCK_DGRAM;
} else {
return -1;
}
int newSock = socket(domain,type,0);
return newSock;
}
void create_addr(int network, char* address, int port,struct sockaddr* dest) {
if (network == 4) {
struct sockaddr_in listen_address;
listen_address.sin_family = AF_INET;
listen_address.sin_port = htons(port);
inet_pton(AF_INET,address,&listen_address.sin_addr);
memcpy(dest,&listen_address,sizeof(listen_address));
return;
} else if (network == 6) {
struct sockaddr_in6 listen_ipv6;
listen_ipv6.sin6_family = AF_INET6;
listen_ipv6.sin6_port = htons(port);
inet_pton(AF_INET6,address,&listen_ipv6.sin6_addr);
memcpy(dest,&listen_ipv6,sizeof(listen_ipv6));
return;
} else {
exit(-2);
}
}
int create_local (int network, char transport, char* address, int port,struct sockaddr* addr_struct) {
int socket = create_socket(network,transport);
if (socket == -1) {
exit(-1);
}
create_addr(network,address,port,addr_struct);
int addrlen = sizeof(*addr_struct);
int i = bind (socket,addr_struct,(socklen_t)addrlen);
if (i < 0) {
printf("Something went wrong: %s\n",strerror(errno));
exit(-3);
}
return socket;
}
int create_remote (int network,char transport,char* address,int port) {
int socket = create_socket(network,transport);
if (socket == -1) {
exit(-1);
}
struct sockaddr remote_addr_struct;
create_addr(network,address,port,&remote_addr_struct);
int addrlen = sizeof(remote_addr_struct);
int i = connect(socket,&remote_addr_struct,(socklen_t)addrlen);
if (i < 0) {
printf("Something went wrong: %s\n",strerror(errno));
exit(-3);
}
return socket;
}

@ -0,0 +1,44 @@
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdlib.h>
/* This function takes:
a layer 3 - network layer - integer, which must be '4' for IPv4
and 6 for IPv6; and
a layer 4 - transport layer - character, which must be 'T' for
TCP or 'U' for UDP.
It returns the created socket, or -1 if the socket creation failed.*/
int create_socket(int network, char transport);
/* This function fills in the sockaddr struct 'dest' based on the given information.
'network' is an integer that contains '4' for IPv4 or '6' for IPv6;
'address' is the address that is filled into the struct;
port is self-explanatory;
and dest is a pointer to the sockaddr struct that will be filled in.
The function exits with error code -2 if the network parameter contained neither '4'
nor '6'. */
void create_addr(int network, char* address, int port,struct sockaddr* dest);
/* This function utilizes the above two functions; it creates the socket and
_binds_ the addresses. It is used for local sockets (server sockets). Parameters are
same as above.
It prints the error returned by 'bind' if something went wrong, and exits with error code '-3'.*/
int create_local (int network, char transport, char* address, int port,struct sockaddr* addr_struct);
/* This function utilizes the same functions as 'create_local' but _connects_ to the
requested address. It is used for remoet sockets (client sockets). The paramters are same
as above.
It prints the error returned by 'connect' if something went wrong, and exits with error code '-3'.*/
int create_remote (int network,char transport,char* address,int port);

102
main.c

@ -1,108 +1,8 @@
#include <sys/socket.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
int create_socket(int network, char transport) {
/* 'network' contains 4 for ipv4 or 6 for ipv6.
'transport' contains 'T' for TCP or 'U' for UDP.
The function returns -1 if the paramters do not match the above statement. */
int domain;
int type;
if (network == 4) {
domain = AF_INET;
} else if (network == 6) {
domain = AF_INET6;
} else {
return -1;
}
if (transport == 'T') {
type = SOCK_STREAM;
} else if (transport == 'U') {
type = SOCK_DGRAM;
} else {
return -1;
}
int newSock = socket(domain,type,0);
return newSock;
}
void create_addr(int network, char* address, int port,struct sockaddr* dest) {
/* Takes the relevant values - network (4 or 6), address, port - and fills them
into dest */
if (network == 4) {
struct sockaddr_in listen_address;
listen_address.sin_family = AF_INET;
listen_address.sin_port = htons(port);
inet_pton(AF_INET,address,&listen_address.sin_addr);
memcpy(dest,&listen_address,sizeof(listen_address));
return;
} else if (network == 6) {
struct sockaddr_in6 listen_ipv6;
listen_ipv6.sin6_family = AF_INET6;
listen_ipv6.sin6_port = htons(port);
inet_pton(AF_INET6,address,&listen_ipv6.sin6_addr);
memcpy(dest,&listen_ipv6,sizeof(listen_ipv6));
return;
} else {
exit(-2);
}
}
int create_and_bind (int network, char transport, char* address, int port,struct sockaddr* addr_struct) {
/* combines the socket creation and address creation into one
function - simply pass the required values, and a structure,
and this function does the legwork for you */
int socket = create_socket(network,transport);
if (socket == -1) {
exit(-1);
}
create_addr(network,address,port,addr_struct);
int addrlen = sizeof(*addr_struct);
int i = bind (socket,addr_struct,(socklen_t)addrlen);
if (i < 0) {
exit(-3);
}
return socket;
}
int create_remote (int network,char transport,char* address,int port) {
/* same as 'create_and_bind', but for remote sockets - client rather
than server sockets */
int socket = create_socket(network,transport);
if (socket == -1) {
exit(-1);
}
struct sockaddr remote_addr_struct;
create_addr(network,address,port,&remote_addr_struct);
int addrlen = sizeof(remote_addr_struct);
int i = connect(socket,&remote_addr_struct,(socklen_t)addrlen);
if (i < 0) {
printf("Something went wrong: %s\n",strerror(errno));
exit(-3);
}
return socket;
}
void forward_data(int from_fd, int to_fd) {
int n = 0;
@ -117,7 +17,7 @@ int main() {
int preferred_network = 4;
char preferred_transport = 'T';
struct sockaddr addr_struct;
int server_sock = create_and_bind(preferred_network,preferred_transport,"127.0.0.1",3000,&addr_struct);
int server_sock = create_local(preferred_network,preferred_transport,"127.0.0.1",3000,&addr_struct);
int addrlen = sizeof(addr_struct);
listen(server_sock,50); /* Arbitrary number, change later */

Loading…
Cancel
Save