Ext
 All Files Functions
net_utils.c
1 
3 #include <string.h>
4 #include <sys/socket.h>
5 #include <netdb.h>
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <unistd.h>
9 #include "net_utils.h"
10 
11 void parse_address(const char* address, char** host, long* port) {
12  char* dots_position = strchr(address, ':');
13  if (dots_position == NULL) {
14  fprintf(stderr, "Address in wrong format\n");
15  exit(EXIT_FAILURE);
16  }
17 
18  *port = strtol(dots_position + 1, NULL, 10);
19 
20  size_t host_size = dots_position - address + 1;
21  *host = calloc(host_size, sizeof(char));
22 
23  memcpy(*host, address, host_size - 1);
24  (*host)[host_size - 1] = '\0';
25 }
26 
27 int make_connection(const char* address) {
28  long port = 0;
29  char* host = NULL;
30  parse_address(address, &host, &port);
31 
32  int sockd = socket(AF_INET, SOCK_STREAM, 0);
33 
34  if (sockd == -1) {
35  fprintf(stderr, "Can't create socket\n");
36  free(host);
37  exit(EXIT_FAILURE);
38  }
39 
40  struct hostent* hostent = gethostbyname(host);
41  in_addr_t* ip = (in_addr_t*) (*hostent->h_addr_list);
42 
43  struct sockaddr_in addr;
44  memset(&addr, 0, sizeof(struct sockaddr_in));
45  addr.sin_addr.s_addr = *ip;
46  addr.sin_family = AF_INET;
47  addr.sin_port = htons(port);
48 
49  if (connect(sockd, (const struct sockaddr*) &addr, sizeof(struct sockaddr_in))
50  == -1) {
51  fprintf(stderr, "Can't connect\n");
52  free(host);
53  exit(EXIT_FAILURE);
54  }
55 
56  free(host);
57  return sockd;
58 }
59 
60 void close_connection(int sockd) {
61  close(sockd);
62 }
63 
64 bool send_command(int sockd, enum Command command) {
65  ssize_t written = write_while(sockd, (char*)&command, sizeof(enum Command));
66 
67  if (written != sizeof(enum Command)) {
68  fprintf(stderr, "Can't write command to socket\n");
69  return false;
70  }
71 
72  return true;
73 }
74 
75 bool send_data(int sockd, char* data, size_t size) {
76  dprintf(sockd, "%zu", size);
77  if (write_while(sockd, data, size) == -1) {
78  return false;
79  }
80 
81  return true;
82 }
83 
84 bool receive_command(int fd, enum Command* command) {
85  ssize_t read = read_while(fd, (char*)command, sizeof(enum Command));
86  if (read != sizeof(enum Command)) {
87  fprintf(stderr, "Can't read command from socket\n");
88  return false;
89  }
90 
91  return true;
92 }
93 
94 bool receive_data(int sockd, char** data, size_t* size) {
95  const size_t buffer_size = 1024;
96  char buffer[buffer_size + 1];
97  ssize_t readed = 0;
98  ssize_t to_read = -1;
99  ssize_t remain_to_read = -1;
100  char* current_pointer_to_write = NULL;
101 
102  while (to_read == -1 || remain_to_read != 0) {
103  ssize_t current_readed = 0;
104  if (remain_to_read != -1) {
105  current_readed = recv(sockd, buffer, remain_to_read, 0);
106  readed += current_readed;
107  } else {
108  current_readed = recv(sockd, buffer, buffer_size, 0);
109  readed += current_readed;
110  }
111 
112  if (current_readed == -1) {
113  fprintf(stderr, "Error while reading data from socket. Abort!\n");
114  return false;
115  }
116 
117  buffer[readed] = '\0';
118 
119  char* end = buffer;
120 
121  if (to_read == -1) {
122  to_read = strtol(buffer, &end, 10);
123  *data = calloc(to_read + 1, sizeof(char));
124  (*data)[to_read] = '\0';
125  current_pointer_to_write = *data;
126  *size = to_read;
127  remain_to_read = to_read;
128  }
129 
130  current_readed -= (end - buffer);
131  remain_to_read -= current_readed;
132 
133  memcpy(current_pointer_to_write, end, current_readed);
134  current_pointer_to_write += current_readed;
135  }
136 
137  return true;
138 }
bool send_command(int sockd, enum Command command)
Definition: net_utils.c:64
int read_while(int fd, char *buffer, size_t to_read)
Properly reading from memory.
Definition: utils.c:23
int write_while(int fd, const char *buffer, size_t to_write)
Properly writing to memory.
Definition: utils.c:38
bool send_data(int sockd, char *data, size_t size)
Definition: net_utils.c:75
void parse_address(const char *address, char **host, long *port)
Definition: net_utils.c:11
bool receive_command(int sockd, enum Command *command)
Definition: net_utils.c:84
bool receive_data(int sockd, char **data, size_t *size)
Definition: net_utils.c:94
void close_connection(int sockd)
Definition: net_utils.c:60
int make_connection(const char *address)
Definition: net_utils.c:27