From 52eb87b7c3354d075a652c1e51eca884605a7600 Mon Sep 17 00:00:00 2001 From: Pawit Pornkitprasan Date: Mon, 29 Apr 2024 12:18:36 +0900 Subject: [PATCH] receiver: network: add error checking Add error checking to make network failures visible, such as trying to binding to a port that is already in-use by another process. --- Receivers/unix/network.c | 20 ++++++++++++++++---- Receivers/unix/scream.c | 4 +++- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/Receivers/unix/network.c b/Receivers/unix/network.c index e6b4585..a95a627 100644 --- a/Receivers/unix/network.c +++ b/Receivers/unix/network.c @@ -1,23 +1,35 @@ #include "network.h" +#include "stdio.h" static rctx_network_t rctx_network; int init_network(enum receiver_type receiver_mode, in_addr_t interface, int port, char* multicast_group) { - rctx_network.sockfd = socket(AF_INET,SOCK_DGRAM,0); + rctx_network.sockfd = socket(AF_INET, SOCK_DGRAM, 0); + if (rctx_network.sockfd < 0) { + perror("Failed to craete socket"); + return 1; + } memset((void *)&(rctx_network.servaddr), 0, sizeof(rctx_network.servaddr)); rctx_network.servaddr.sin_family = AF_INET; rctx_network.servaddr.sin_addr.s_addr = (receiver_mode == Unicast) ? interface : htonl(INADDR_ANY); rctx_network.servaddr.sin_port = htons(port); - bind(rctx_network.sockfd, (struct sockaddr *)&rctx_network.servaddr, sizeof(rctx_network.servaddr)); + + if (bind(rctx_network.sockfd, (struct sockaddr *)&rctx_network.servaddr, sizeof(rctx_network.servaddr)) != 0) { + perror("Failed to bind to interface"); + return 1; + } if (receiver_mode == Multicast) { rctx_network.imreq.imr_multiaddr.s_addr = inet_addr(multicast_group ? multicast_group : DEFAULT_MULTICAST_GROUP); rctx_network.imreq.imr_interface.s_addr = interface; - setsockopt(rctx_network.sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, - (const void *)&rctx_network.imreq, sizeof(struct ip_mreq)); + if (setsockopt(rctx_network.sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, + (const void *)&rctx_network.imreq, sizeof(struct ip_mreq)) != 0) { + perror("Failed to join multicast group"); + return 1; + }; } return 0; diff --git a/Receivers/unix/scream.c b/Receivers/unix/scream.c index 591a1a4..cf09c49 100644 --- a/Receivers/unix/scream.c +++ b/Receivers/unix/scream.c @@ -314,7 +314,9 @@ int main(int argc, char*argv[]) { case Multicast: default: if (verbosity) fprintf(stderr, "Starting %s receiver\n", receiver_mode == Unicast ? "unicast" : "multicast"); - init_network(receiver_mode, interface, port, multicast_group); + if (init_network(receiver_mode, interface, port, multicast_group) != 0) { + return 1; + } receiver_rcv_fn = rcv_network; break; }