4 #include <sys/socket.h>
12 char* dots_position = strchr(address,
':');
13 if (dots_position == NULL) {
14 fprintf(stderr,
"Address in wrong format\n");
18 *port = strtol(dots_position + 1, NULL, 10);
20 size_t host_size = dots_position - address + 1;
21 *host = calloc(host_size,
sizeof(
char));
23 memcpy(*host, address, host_size - 1);
24 (*host)[host_size - 1] =
'\0';
32 int sockd = socket(AF_INET, SOCK_STREAM, 0);
35 fprintf(stderr,
"Can't create socket\n");
40 struct hostent* hostent = gethostbyname(host);
41 in_addr_t* ip = (in_addr_t*) (*hostent->h_addr_list);
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);
49 if (connect(sockd, (
const struct sockaddr*) &addr,
sizeof(
struct sockaddr_in))
51 fprintf(stderr,
"Can't connect\n");
65 ssize_t written =
write_while(sockd, (
char*)&command,
sizeof(
enum Command));
67 if (written !=
sizeof(
enum Command)) {
68 fprintf(stderr,
"Can't write command to socket\n");
75 bool send_data(
int sockd,
char* data,
size_t size) {
76 dprintf(sockd,
"%zu", size);
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");
95 const size_t buffer_size = 1024;
96 char buffer[buffer_size + 1];
99 ssize_t remain_to_read = -1;
100 char* current_pointer_to_write = NULL;
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;
108 current_readed = recv(sockd, buffer, buffer_size, 0);
109 readed += current_readed;
112 if (current_readed == -1) {
113 fprintf(stderr,
"Error while reading data from socket. Abort!\n");
117 buffer[readed] =
'\0';
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;
127 remain_to_read = to_read;
130 current_readed -= (end - buffer);
131 remain_to_read -= current_readed;
133 memcpy(current_pointer_to_write, end, current_readed);
134 current_pointer_to_write += current_readed;
bool send_command(int sockd, enum Command command)
int read_while(int fd, char *buffer, size_t to_read)
Properly reading from memory.
int write_while(int fd, const char *buffer, size_t to_write)
Properly writing to memory.
bool send_data(int sockd, char *data, size_t size)
void parse_address(const char *address, char **host, long *port)
bool receive_command(int sockd, enum Command *command)
bool receive_data(int sockd, char **data, size_t *size)
void close_connection(int sockd)
int make_connection(const char *address)