[lib] getaddrinfo() in create_udp_trx_socket()

Use getaddrinfo() to resolve names in owl_create_udp_trx_socket(). The
client_description parameter has been removed from the function's
synopsis.
This commit is contained in:
Matteo Cypriani 2013-09-20 17:07:46 -04:00
parent e58d158286
commit 25cc1ee67a
12 changed files with 70 additions and 65 deletions

View File

@ -22,7 +22,7 @@ set_target_properties(
PROPERTIES
OUTPUT_NAME owlps-client
SOVERSION 1
VERSION 1.1
VERSION 1.2
)
# Add compile flags

View File

@ -42,13 +42,10 @@
*/
int owl_create_trx_socket(const char *const dest_ip,
const uint_fast16_t dest_port,
struct sockaddr_in *const server,
struct sockaddr *const server,
const char *const iface)
{
struct sockaddr_in client ;
int sockfd = owl_create_udp_trx_socket(dest_ip, dest_port,
server, &client) ;
int sockfd = owl_create_udp_trx_socket(dest_ip, dest_port, server) ;
if (sockfd < 0)
{
perror("Error! Cannot create UDP sending socket to the aggregation"
@ -107,7 +104,7 @@ void owl_use_iface(const int sockfd, const char *const iface)
* standard output.
*/
void owl_send_request(const int sockfd,
const struct sockaddr_in *const server,
const struct sockaddr *const server,
const void *const packet,
const uint_fast16_t packet_size,
const uint_fast16_t nb_pkt,
@ -151,14 +148,13 @@ void owl_send_request(const int sockfd,
* and the standard output will be flushed.
*/
void owl_send_packet(const int sockfd,
const struct sockaddr_in *const server,
const struct sockaddr *const server,
const void *const packet,
const uint_fast16_t packet_size,
const bool verbose)
{
ssize_t nsent = sendto(sockfd, packet, packet_size, 0,
(struct sockaddr *) server,
(socklen_t) sizeof(*server)) ;
server, (socklen_t) sizeof(*server)) ;
if (nsent != (ssize_t) packet_size)
{
perror("Error sending data to the network") ;

View File

@ -30,13 +30,13 @@
/// Opens a transmission socket
int owl_create_trx_socket(const char *const dest_ip,
const uint_fast16_t dest_port,
struct sockaddr_in *const server,
struct sockaddr *const server,
const char *const iface) ;
/// Selects a transmission interface for the socket `sockfd`
void owl_use_iface(const int sockfd, const char *const iface) ;
/// Transmits a request
void owl_send_request(const int sockfd,
const struct sockaddr_in *const server,
const struct sockaddr *const server,
const void *const packet,
const uint_fast16_t packet_size,
const uint_fast16_t nb_pkt,
@ -44,7 +44,7 @@ void owl_send_request(const int sockfd,
const bool verbose) ;
/// Transmits a packet
void owl_send_packet(const int sockfd,
const struct sockaddr_in *const server,
const struct sockaddr *const server,
const void *const packet,
const uint_fast16_t packet_size,
const bool verbose) ;

View File

@ -33,7 +33,7 @@ set_target_properties(
PROPERTIES
OUTPUT_NAME owlps
SOVERSION 3
VERSION 3.2
VERSION 3.3
)
# Add compile flags

View File

@ -28,6 +28,7 @@
#include <signal.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <assert.h>
@ -416,40 +417,57 @@ float owl_swap_float(const float f)
* @param[in] server_port The listening port on the server.
* @param[out] server_description The structure in which the server
* description will be saved.
* @param[out] client_description The structure in which the client
* description will be saved.
*
* @returns A file descriptor to the opened socket in case of success,
* or a negative error code.
*/
int owl_create_udp_trx_socket(const char *const server_address,
const uint_fast16_t server_port,
struct sockaddr_in *const server_description,
struct sockaddr_in *const client_description)
struct sockaddr *const server_description)
{
int sockfd ; // Socket descriptor
char server_port_str[6] ;
struct addrinfo
gai_hints,
*gai_results = NULL,
*gai_res = NULL ;
int gai_ret ; // Return value of getaddrinfo()
int sockfd = -1 ; // Socket descriptor
/* Create the UDP socket */
sockfd = socket(AF_INET, SOCK_DGRAM, 0) ;
if (sockfd < 0)
/* Get the server information */
sprintf(server_port_str, "%"PRIuFAST16, server_port) ;
memset(&gai_hints, 0, sizeof(struct addrinfo)) ;
gai_hints.ai_family = AF_INET ; // IPv4 only
gai_hints.ai_socktype = SOCK_DGRAM ;
gai_ret = getaddrinfo(server_address, server_port_str,
&gai_hints, &gai_results) ;
if (gai_ret)
{
perror("UDP socket creation failed") ;
fprintf(stderr, "UDP socket creation failed: getaddrinfo(): %s\n",
gai_strerror(gai_ret)) ;
return -OWL_ERR_SOCKET_CREATE ;
}
/* Initialise the client structure */
memset(client_description, 0, sizeof(*client_description)) ;
client_description->sin_family = AF_INET ; // INET socket
client_description->sin_addr.s_addr = htonl(INADDR_ANY) ;
/* Create the UDP socket: loop until socket() succeeds */
for (gai_res = gai_results ; gai_res != NULL ;
gai_res = gai_res->ai_next)
{
sockfd = socket(gai_res->ai_family, gai_res->ai_socktype,
gai_res->ai_protocol) ;
if (sockfd != -1)
break ;
}
/* Initialise the server structure */
memset(server_description, 0, sizeof(*server_description)) ;
server_description->sin_family = AF_INET ; // INET socket
// Server IP address:
server_description->sin_addr.s_addr = inet_addr(server_address) ;
// Listening port on the server:
server_description->sin_port = htons(server_port) ;
if (gai_res == NULL)
{
fprintf(stderr,
"UDP socket creation failed: socket().\n") ;
return -OWL_ERR_SOCKET_CREATE ;
}
/* Copy the server description */
memcpy(server_description, gai_res->ai_addr, gai_res->ai_addrlen) ;
freeaddrinfo(gai_results) ;
return sockfd ;
}

View File

@ -403,8 +403,7 @@ float owl_swap_float(const float f) ;
/// Opens a UDP transmission socket
int owl_create_udp_trx_socket(const char *const server_address,
const uint_fast16_t server_port,
struct sockaddr_in *const server_description,
struct sockaddr_in *const client_description) ;
struct sockaddr *const server_description) ;
/// Opens a UDP reception socket
int owl_create_udp_listening_socket(const uint_fast16_t port) ;
//@}

View File

@ -117,14 +117,14 @@ void add_captured_request(const owl_timestamp *const reception_time,
void* monitor_requests(void *NULL_value) ;
void scan_request_list(FILE *const stream,
const int sockfd,
const struct sockaddr_in *const serv) ;
const struct sockaddr *const serv) ;
void flush_request_list(FILE *const stream,
const int sockfd,
const struct sockaddr_in *const serv) ;
const struct sockaddr *const serv) ;
void output_request(request_list *const request_ptr,
FILE *const stream,
const int sockfd,
const struct sockaddr_in *const serv) ;
const struct sockaddr *const serv) ;
#ifndef NDEBUG
void print_request_list(void) ;

View File

@ -829,8 +829,7 @@ void add_captured_request(const owl_timestamp *const reception_time,
void* monitor_requests(void *NULL_value)
{
FILE *stream = NULL ;
struct sockaddr_in serv;
struct sockaddr_in client ;
struct sockaddr serv;
int sockfd;
if (VERBOSE_WARNING)
@ -839,7 +838,7 @@ void* monitor_requests(void *NULL_value)
sockfd =
owl_create_udp_trx_socket(cfg_getstr(cfg, "positioner_ip"),
cfg_getint(cfg, "positioner_port"),
&serv, &client) ;
&serv) ;
pthread_cleanup_push(&owl_close_fd, &sockfd) ;
/* Open output file */
@ -879,7 +878,7 @@ void* monitor_requests(void *NULL_value)
*/
void scan_request_list(FILE *const stream,
const int sockfd,
const struct sockaddr_in *const serv)
const struct sockaddr *const serv)
{
request_list *request_ptr ;
request_list *request_prev = NULL ;
@ -961,7 +960,7 @@ void scan_request_list(FILE *const stream,
*/
void flush_request_list(FILE *const stream,
const int sockfd,
const struct sockaddr_in *const serv)
const struct sockaddr *const serv)
{
request_list *next_request ;
@ -1002,7 +1001,7 @@ void flush_request_list(FILE *const stream,
void output_request(request_list *const request_ptr,
FILE *const stream,
const int sockfd,
const struct sockaddr_in *const serv)
const struct sockaddr *const serv)
{
char mac_str[OWL_ETHER_ADDR_STRLEN] ;
char request_time_str[OWL_TIMESTAMP_STRLEN] ;
@ -1058,8 +1057,7 @@ void output_request(request_list *const request_ptr,
}
request.nb_info = htons(request.nb_info) ;
// Send the request's main data:
sendto(sockfd, &request, sizeof(request), 0,
(const struct sockaddr *const)serv, serv_len) ;
sendto(sockfd, &request, sizeof(request), 0, serv, serv_len) ;
// Send request's per-CP information to the server and delete it
// from the request
@ -1073,8 +1071,7 @@ void output_request(request_list *const request_ptr,
info.capture_time = request_info_ptr->capture_time ;
owl_hton_timestamp(&info.capture_time) ;
info.ss_dbm = request_info_ptr->ss_dbm ;
sendto(sockfd, &info, sizeof(info),
0, (const struct sockaddr *const)serv, serv_len) ;
sendto(sockfd, &info, sizeof(info), 0, serv, serv_len) ;
// Print CP info to the output file
owl_mac_bytes_to_string_r(request_info_ptr->cp_mac_addr_bytes,
@ -1461,8 +1458,7 @@ void unlink_cp(cp_list *cp)
void order_send(cp_list *cp)
{
owl_autocalibration_order message ;
struct sockaddr_in serv;
struct sockaddr_in client ;
struct sockaddr serv;
socklen_t serv_len = sizeof(serv);
int sockfd ;
ssize_t nsent ;
@ -1474,11 +1470,10 @@ void order_send(cp_list *cp)
owl_create_udp_trx_socket(cp->ip_addr,
cfg_getint(cfg,
"autocalibration_order_port"),
&serv, &client) ;
&serv) ;
message.order = AUTOCALIBRATION_ORDER_SEND ;
nsent = sendto(sockfd, &message, sizeof(message), 0,
(struct sockaddr *)&serv, serv_len) ;
nsent = sendto(sockfd, &message, sizeof(message), 0, &serv, serv_len) ;
if (nsent != (ssize_t) sizeof(message))
{
perror("Error sending order to the listener") ;

View File

@ -115,7 +115,7 @@ char *program_name = NULL ;
bool is_calibration_request = false ;
int sockfd ; // Sending socket descriptor
struct sockaddr_in server ; // Server info
struct sockaddr server ; // Server info
uint8_t *packet = NULL ; // Packet to send
uint_fast16_t packet_size ; // Packet size

View File

@ -71,11 +71,11 @@ bool dump_configuration = false ;
pcap_t *capture_handler = NULL ; // Packet capture descriptor
int aggregation_sockfd ;
struct sockaddr_in aggregation_server ;
struct sockaddr aggregation_server ;
#ifdef OWLPS_LISTENER_USES_PTHREAD
int autocalibration_send_sockfd ;
struct sockaddr_in autocalibration_send_server ;
struct sockaddr autocalibration_send_server ;
// true if the coordinates of the listener were provided by the user:
bool coordinates_provided = false ;
#endif // OWLPS_LISTENER_USES_PTHREAD
@ -1217,8 +1217,7 @@ void read_packet(const struct pcap_pkthdr *pkt_header,
/* Send the request to the aggregator */
nsent =
sendto(aggregation_sockfd, &request, sizeof(request), 0,
(struct sockaddr *) &aggregation_server,
(socklen_t) sizeof(aggregation_server)) ;
&aggregation_server, (socklen_t) sizeof(aggregation_server)) ;
if (nsent != (ssize_t) sizeof(request))
{
perror("Error sending request to the aggregation server") ;
@ -1539,7 +1538,7 @@ void get_ip_addr(const char *const iface, char ip[INET_ADDRSTRLEN])
void* autocalibrate_hello(void *NULL_value)
{
int send_sockfd ;
struct sockaddr_in serv;
struct sockaddr serv;
owl_autocalibration_hello message ;
if (VERBOSE_WARNING)

View File

@ -30,8 +30,7 @@ protected:
std::string remote_host ;
uint_fast16_t remote_port ;
struct sockaddr_in server_info ;
struct sockaddr_in client_info ;
struct sockaddr server_info ;
/** @name Operations */
//@{

View File

@ -49,7 +49,7 @@ OutputUDPSocket::OutputUDPSocket(const string &_remote_host,
bool OutputUDPSocket::init_socket()
{
sockfd = owl_create_udp_trx_socket(remote_host.c_str(), remote_port,
&server_info, &client_info) ;
&server_info) ;
return sockfd >= 0 ;
}
@ -61,8 +61,7 @@ bool OutputUDPSocket::send_data(const string &data) const
{
unsigned int data_len = data.size() + 1 ; // +1 for the '\0'
ssize_t nsent = sendto(sockfd, data.c_str(), data_len, 0,
(struct sockaddr *) &server_info,
sizeof(server_info)) ;
&server_info, sizeof(server_info)) ;
if (nsent != static_cast<ssize_t>(data_len))
{
perror("Error sending result data through the UDP socket") ;