aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/akcom-udpecho.c
diff options
context:
space:
mode:
authorDavid M. Syzdek <david.syzdek@acsalaska.com>2022-07-21 16:33:41 -0800
committerDavid M. Syzdek <david.syzdek@acsalaska.com>2022-07-21 16:33:41 -0800
commit381cf57926ef1a658ffd7d0a9b08762757efd773 (patch)
tree0ec2f4c9c9277e773ce7409b5872f3f56b4cb8cd /src/akcom-udpecho.c
parente7373b5b93ae5ebc488e53a48f24f10253041051 (diff)
downloadakcom-udpecho-381cf57926ef1a658ffd7d0a9b08762757efd773.tar.gz
akcom-udpecho-381cf57926ef1a658ffd7d0a9b08762757efd773.tar.bz2
akcom-udpecho-381cf57926ef1a658ffd7d0a9b08762757efd773.tar.xz
akcom-udpecho-381cf57926ef1a658ffd7d0a9b08762757efd773.zip
akcom-udpecho: moving socket functions to my_socket()
Diffstat (limited to '')
-rw-r--r--src/akcom-udpecho.c142
1 files changed, 82 insertions, 60 deletions
diff --git a/src/akcom-udpecho.c b/src/akcom-udpecho.c
index e3966fe..d42c809 100644
--- a/src/akcom-udpecho.c
+++ b/src/akcom-udpecho.c
@@ -154,6 +154,7 @@ static int cnf_silent = 0;
154static unsigned long cnf_timeout = 5; 154static unsigned long cnf_timeout = 5;
155static const char * cnf_port = "30006"; 155static const char * cnf_port = "30006";
156static const char * cnf_host = NULL; 156static const char * cnf_host = NULL;
157static int cnf_ai_family = PF_UNSPEC;
157static unsigned long cnf_interval = 1; 158static unsigned long cnf_interval = 1;
158static size_t cnf_packetsize = sizeof(struct udp_echo_plus); 159static size_t cnf_packetsize = sizeof(struct udp_echo_plus);
159static int should_stop = 0; 160static int should_stop = 0;
@@ -173,6 +174,13 @@ main(
173 char * argv[] ); 174 char * argv[] );
174 175
175 176
177int
178my_socket(
179 const char * host,
180 const char * port,
181 int family );
182
183
176// signal system stop 184// signal system stop
177static void 185static void
178 my_stop( 186 my_stop(
@@ -224,15 +232,7 @@ main(
224 uint64_t avg; 232 uint64_t avg;
225 uint64_t avg_adj; 233 uint64_t avg_adj;
226 ssize_t size; 234 ssize_t size;
227 unsigned short port;
228 char * ptr; 235 char * ptr;
229 char addrstr[INET6_ADDRSTRLEN];
230 char logmsg[256];
231 union my_sa sa;
232 socklen_t socklen;
233 struct addrinfo * res;
234 struct addrinfo * info;
235 struct addrinfo hints;
236 struct timespec start; 236 struct timespec start;
237 struct timespec now; 237 struct timespec now;
238 struct pollfd fds[2]; 238 struct pollfd fds[2];
@@ -259,13 +259,6 @@ main(
259 if ((ptr = rindex(argv[0], '/')) != NULL) 259 if ((ptr = rindex(argv[0], '/')) != NULL)
260 prog_name = &ptr[1]; 260 prog_name = &ptr[1];
261 261
262 // initializes variables
263 bzero(&hints, sizeof(struct addrinfo));
264 hints.ai_flags = AI_ADDRCONFIG | AI_V4MAPPED | AI_ALL;
265 hints.ai_family = PF_UNSPEC;
266 hints.ai_socktype = SOCK_DGRAM;
267 hints.ai_protocol = IPPROTO_UDP;
268
269 // process arguments 262 // process arguments
270 while((c = getopt_long(argc, argv, short_opt, long_opt, &opt_index)) != -1) 263 while((c = getopt_long(argc, argv, short_opt, long_opt, &opt_index)) != -1)
271 { 264 {
@@ -276,11 +269,11 @@ main(
276 break; 269 break;
277 270
278 case '4': 271 case '4':
279 hints.ai_family = PF_INET; 272 cnf_ai_family = PF_INET;
280 break; 273 break;
281 274
282 case '6': 275 case '6':
283 hints.ai_family = PF_INET6; 276 cnf_ai_family = PF_INET6;
284 break; 277 break;
285 278
286 case 'c': 279 case 'c':
@@ -386,50 +379,8 @@ main(
386 379
387 380
388 // resolve host 381 // resolve host
389 bzero(&sa, sizeof(sa)); 382 if ((s = my_socket(cnf_host, cnf_port, cnf_ai_family)) == -1)
390 bzero(addrstr, sizeof(addrstr));
391 socklen = 0;
392 if ((rc = getaddrinfo(cnf_host, cnf_port, &hints, &res)) != 0)
393 {
394 fprintf(stderr, "%s: getaddrinfo(): %s\n", prog_name, gai_strerror(rc));
395 free(sndbuff.data);
396 free(rcvbuff.data);
397 return(1);
398 };
399 for(info = res; (info != NULL); info = info->ai_next)
400 { 383 {
401 if (info->ai_addr->sa_family != AF_INET6)
402 continue;
403 socklen = info->ai_addrlen;
404 memcpy(&sa, info->ai_addr, socklen);
405 inet_ntop(AF_INET6, &sa.sin6.sin6_addr, addrstr, sizeof(addrstr));
406 port = ntohs(sa.sin6.sin6_port);
407 snprintf(logmsg, sizeof(logmsg), "UDPECHO %s:%hu ([%s]:%hu): %zu bytes\n", cnf_host, port, addrstr, port, cnf_packetsize);
408 }
409 if (sa.sa.sa_family != AF_INET6)
410 {
411 socklen = res->ai_addrlen;
412 memcpy(&sa.sa, res->ai_addr, socklen);
413 inet_ntop(AF_INET, &sa.sin.sin_addr, addrstr, sizeof(addrstr));
414 port = ntohs(sa.sin.sin_port);
415 snprintf(logmsg, sizeof(logmsg), "UDPECHO %s:%hu (%s:%hu): %zu bytes\n", cnf_host, port, addrstr, port, cnf_packetsize);
416 };
417 freeaddrinfo(res);
418 if (!(cnf_silent))
419 printf("%s", logmsg);
420
421
422 // open and connect socket
423 if ((s = socket(sa.sa.sa_family, SOCK_DGRAM, 0)) == -1)
424 {
425 fprintf(stderr, "%s: socket(): %s\n", prog_name, strerror(errno));
426 free(sndbuff.data);
427 free(rcvbuff.data);
428 return(1);
429 };
430 if ((rc = connect(s, &sa.sa, socklen)) == -1)
431 {
432 fprintf(stderr, "%s: connect(): %s\n", prog_name, strerror(errno));
433 free(sndbuff.data); 384 free(sndbuff.data);
434 free(rcvbuff.data); 385 free(rcvbuff.data);
435 return(1); 386 return(1);
@@ -597,6 +548,77 @@ main(
597} 548}
598 549
599 550
551int
552my_socket(
553 const char * host,
554 const char * service,
555 int family )
556{
557 int rc;
558 int s;
559 unsigned short port;
560 socklen_t socklen;
561 struct addrinfo * res;
562 struct addrinfo * info;
563 struct addrinfo hints;
564 union my_sa sa;
565 char addrstr[INET6_ADDRSTRLEN];
566 char logmsg[256];
567
568 memset(&hints, 0, sizeof(struct addrinfo));
569 hints.ai_flags = AI_ADDRCONFIG | AI_V4MAPPED | AI_ALL;
570 hints.ai_family = family;
571 hints.ai_socktype = SOCK_DGRAM;
572 hints.ai_protocol = IPPROTO_UDP;
573
574 // resolve host
575 memset(&sa, 0, sizeof(sa));
576 memset(addrstr, 0, sizeof(addrstr));
577 socklen = 0;
578 if ((rc = getaddrinfo(host, service, &hints, &res)) != 0)
579 {
580 fprintf(stderr, "%s: getaddrinfo(): %s\n", prog_name, gai_strerror(rc));
581 return(-1);
582 };
583 for(info = res; (info != NULL); info = info->ai_next)
584 {
585 if (info->ai_addr->sa_family != AF_INET6)
586 continue;
587 socklen = info->ai_addrlen;
588 memcpy(&sa, info->ai_addr, socklen);
589 inet_ntop(AF_INET6, &sa.sin6.sin6_addr, addrstr, sizeof(addrstr));
590 port = ntohs(sa.sin6.sin6_port);
591 snprintf(logmsg, sizeof(logmsg), "UDPECHO %s:%hu ([%s]:%hu): %zu bytes\n", cnf_host, port, addrstr, port, cnf_packetsize);
592 }
593 if (sa.sa.sa_family != AF_INET6)
594 {
595 socklen = res->ai_addrlen;
596 memcpy(&sa.sa, res->ai_addr, socklen);
597 inet_ntop(AF_INET, &sa.sin.sin_addr, addrstr, sizeof(addrstr));
598 port = ntohs(sa.sin.sin_port);
599 snprintf(logmsg, sizeof(logmsg), "UDPECHO %s:%hu (%s:%hu): %zu bytes\n", cnf_host, port, addrstr, port, cnf_packetsize);
600 };
601 freeaddrinfo(res);
602 if (!(cnf_silent))
603 printf("%s", logmsg);
604
605
606 // open and connect socket
607 if ((s = socket(sa.sa.sa_family, SOCK_DGRAM, 0)) == -1)
608 {
609 fprintf(stderr, "%s: socket(): %s\n", prog_name, strerror(errno));
610 return(-1);
611 };
612 if ((rc = connect(s, &sa.sa, socklen)) == -1)
613 {
614 fprintf(stderr, "%s: connect(): %s\n", prog_name, strerror(errno));
615 return(-1);
616 };
617
618 return(s);
619}
620
621
600// signal system stop 622// signal system stop
601void 623void
602my_stop( 624my_stop(