FreeCalypso > hg > themwi-rtp-lib
changeset 17:2a24487453a7
implement twrtp_bind_fdpair()
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 07 Jul 2024 00:02:44 +0000 |
parents | 58e9719d1a84 |
children | ec50018cc4ea |
files | include/fdpair.h src/Makefile src/bind_fdpair.c |
diffstat | 3 files changed, 74 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/fdpair.h Sun Jul 07 00:02:44 2024 +0000 @@ -0,0 +1,10 @@ +/* + * This header file provides API declaration for twrtp_bind_fdpair() + * standalone function. + */ + +#pragma once + +#include <stdint.h> + +int twrtp_bind_fdpair(const char *ip, uint16_t port, int *fd_rtp, int *fd_rtcp);
--- a/src/Makefile Sat Jul 06 22:00:06 2024 +0000 +++ b/src/Makefile Sun Jul 07 00:02:44 2024 +0000 @@ -1,4 +1,4 @@ -OBJS= twjit.o twjit_in.o twjit_out.o twjit_vty.o +OBJS= bind_fdpair.o twjit.o twjit_in.o twjit_out.o twjit_vty.o LIB= libtwrtp.a include ../config.defs
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/bind_fdpair.c Sun Jul 07 00:02:44 2024 +0000 @@ -0,0 +1,63 @@ +/* + * Here we implement the function that creates and binds a pair of + * UDP sockets for RTP & RTCP, given the bind IP address in string form + * and the even port number in integer form. + * + * The current implementation supports only IPv4; however, given that + * the API takes a string for the IP address, it should be possible + * to extend this function to support IPv6 if and when such support + * becomes necessary. + */ + +#include <sys/types.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#include <stdint.h> +#include <unistd.h> +#include <errno.h> + +#include <themwi/rtp/fdpair.h> + +int twrtp_bind_fdpair(const char *ip, uint16_t port, int *fd_rtp, int *fd_rtcp) +{ + struct sockaddr_in sin; + int rc; + + sin.sin_family = AF_INET; + rc = inet_aton(ip, &sin.sin_addr); + if (!rc) + return -EINVAL; + + /* do RTP socket first */ + rc = socket(AF_INET, SOCK_DGRAM, 0); + if (rc < 0) + return -errno; + *fd_rtp = rc; + sin.sin_port = htons(port); + rc = bind(*fd_rtp, (struct sockaddr *) &sin, sizeof sin); + if (rc < 0) { + rc = -errno; + close(*fd_rtp); + return rc; + } + + /* now do RTCP */ + rc = socket(AF_INET, SOCK_DGRAM, 0); + if (rc < 0) { + rc = -errno; + close(*fd_rtp); + return rc; + } + *fd_rtcp = rc; + sin.sin_port = htons(port + 1); + rc = bind(*fd_rtcp, (struct sockaddr *) &sin, sizeof sin); + if (rc < 0) { + rc = -errno; + close(*fd_rtp); + close(*fd_rtcp); + return rc; + } + + return 0; +}