tor_multipath_voip/src/net_tools.c

57 lines
1.4 KiB
C
Raw Normal View History

2019-02-08 13:28:39 +00:00
#include "net_tools.h"
int create_tcp_client(char* host, char* service) {
int err, sock;
struct addrinfo conf;
struct addrinfo *result, *cursor;
memset(&conf, 0, sizeof(struct addrinfo));
conf.ai_family = AF_UNSPEC;
conf.ai_socktype = SOCK_STREAM;
conf.ai_flags = 0;
conf.ai_protocol = 0;
err = getaddrinfo(host, service, &conf, &result);
if (err != 0) {
fprintf(stderr, "Error with getaddrinfo()\n");
exit(EXIT_FAILURE);
}
for (cursor = result; cursor != NULL; cursor = cursor->ai_next) {
sock = socket(cursor->ai_family, cursor->ai_socktype, cursor->ai_protocol);
if (sock == -1) continue;
if (connect(sock, cursor->ai_addr, cursor->ai_addrlen) != -1) break;
close(sock);
}
if (cursor == NULL) {
fprintf(stderr, "No connect worked\n");
exit(EXIT_FAILURE);
}
freeaddrinfo(result);
return sock;
}
int read_entity(int fd, void* entity, int size) {
int remaining = size;
int total_read = 0;
while (remaining > 0) {
int nread = read(fd, ((char*)entity)+total_read, remaining);
if (nread == -1) {
return nread;
}
remaining -= nread;
total_read += nread;
}
return total_read;
}
void fill_buffer(size_t* written, char* dest, void *src, size_t n) {
memcpy(dest+*written, src, n);
*written += n;
}