blob: cf7ad230d895f07d60c1c7764c2f0da5257902f5 [file] [log] [blame]
Brian Silverman4acae812016-03-14 13:16:19 -04001#include "aos/vision/events/udp.h"
2
Tyler Chatowbf0609c2021-07-31 16:13:27 -07003#include <cstring>
Brian Silverman4acae812016-03-14 13:16:19 -04004
Alex Perrycb7da4b2019-08-28 19:35:56 -07005#include "glog/logging.h"
Brian Silverman4acae812016-03-14 13:16:19 -04006
Stephan Pleinesf63bde82024-01-13 15:59:33 -08007namespace aos::events {
Brian Silverman4acae812016-03-14 13:16:19 -04008
Parker Schuh2cd173d2017-01-28 00:12:01 -08009TXUdpSocket::TXUdpSocket(const std::string &ip_addr, int port)
Alex Perrycb7da4b2019-08-28 19:35:56 -070010 : fd_(socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) {
11 PCHECK(fd_.get() != -1);
Brian Silverman2ccf8c52016-03-15 00:22:26 -040012 sockaddr_in destination_in;
13 memset(&destination_in, 0, sizeof(destination_in));
Brian Silverman4acae812016-03-14 13:16:19 -040014 destination_in.sin_family = AF_INET;
15 destination_in.sin_port = htons(port);
Alex Perrycb7da4b2019-08-28 19:35:56 -070016 CHECK(inet_aton(ip_addr.c_str(), &destination_in.sin_addr) != 0)
17 << ": invalid IP address " << ip_addr;
Brian Silverman4acae812016-03-14 13:16:19 -040018
Alex Perrycb7da4b2019-08-28 19:35:56 -070019 PCHECK(connect(fd_.get(), reinterpret_cast<sockaddr *>(&destination_in),
20 sizeof(destination_in)) == 0);
Brian Silverman4acae812016-03-14 13:16:19 -040021}
22
Parker Schuh2cd173d2017-01-28 00:12:01 -080023int TXUdpSocket::Send(const char *data, int size) {
Parker Schuh309dd722017-02-25 11:31:18 -080024 // Don't fail on send. If no one is connected that is fine.
25 return send(fd_.get(), data, size, 0);
Brian Silverman4acae812016-03-14 13:16:19 -040026}
27
Austin Schuh8d5fff42018-05-30 20:44:12 -070028int RXUdpSocket::SocketBindListenOnPort(int port) {
Alex Perrycb7da4b2019-08-28 19:35:56 -070029 int fd;
30 PCHECK((fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) != -1);
Brian Silverman2ccf8c52016-03-15 00:22:26 -040031 sockaddr_in bind_address;
32 memset(&bind_address, 0, sizeof(bind_address));
Brian Silverman4acae812016-03-14 13:16:19 -040033
34 bind_address.sin_family = AF_INET;
35 bind_address.sin_port = htons(port);
36 bind_address.sin_addr.s_addr = htonl(INADDR_ANY);
37
Alex Perrycb7da4b2019-08-28 19:35:56 -070038 PCHECK(bind(fd, reinterpret_cast<sockaddr *>(&bind_address),
39 sizeof(bind_address)) == 0);
Austin Schuh8d5fff42018-05-30 20:44:12 -070040 return fd;
Brian Silverman4acae812016-03-14 13:16:19 -040041}
42
Austin Schuh8d5fff42018-05-30 20:44:12 -070043RXUdpSocket::RXUdpSocket(int port) : fd_(SocketBindListenOnPort(port)) {}
44
Brian Silverman4acae812016-03-14 13:16:19 -040045int RXUdpSocket::Recv(void *data, int size) {
Alex Perrycb7da4b2019-08-28 19:35:56 -070046 int result;
47 PCHECK((result = recv(fd_.get(), static_cast<char *>(data), size, 0)) != -1);
48 return result;
Brian Silverman4acae812016-03-14 13:16:19 -040049}
50
Stephan Pleinesf63bde82024-01-13 15:59:33 -080051} // namespace aos::events