FreeCalypso > hg > themwi-rtp-lib
diff src/bind_fdpair.c @ 17:2a24487453a7
implement twrtp_bind_fdpair()
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 07 Jul 2024 00:02:44 +0000 |
parents | |
children |
line wrap: on
line diff
--- /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; +}