ESPHome 2025.5.0
Loading...
Searching...
No Matches
socket.cpp
Go to the documentation of this file.
1#include "socket.h"
2#if defined(USE_SOCKET_IMPL_LWIP_TCP) || defined(USE_SOCKET_IMPL_LWIP_SOCKETS) || defined(USE_SOCKET_IMPL_BSD_SOCKETS)
3#include <cerrno>
4#include <cstring>
5#include <string>
6#include "esphome/core/log.h"
7
8namespace esphome {
9namespace socket {
10
12
13std::unique_ptr<Socket> socket_ip(int type, int protocol) {
14#if USE_NETWORK_IPV6
15 return socket(AF_INET6, type, protocol);
16#else
17 return socket(AF_INET, type, protocol);
18#endif /* USE_NETWORK_IPV6 */
19}
20
21socklen_t set_sockaddr(struct sockaddr *addr, socklen_t addrlen, const std::string &ip_address, uint16_t port) {
22#if USE_NETWORK_IPV6
23 if (ip_address.find(':') != std::string::npos) {
24 if (addrlen < sizeof(sockaddr_in6)) {
25 errno = EINVAL;
26 return 0;
27 }
28 auto *server = reinterpret_cast<sockaddr_in6 *>(addr);
29 memset(server, 0, sizeof(sockaddr_in6));
30 server->sin6_family = AF_INET6;
31 server->sin6_port = htons(port);
32
33 ip6_addr_t ip6;
34 inet6_aton(ip_address.c_str(), &ip6);
35 memcpy(server->sin6_addr.un.u32_addr, ip6.addr, sizeof(ip6.addr));
36 return sizeof(sockaddr_in6);
37 }
38#endif /* USE_NETWORK_IPV6 */
39 if (addrlen < sizeof(sockaddr_in)) {
40 errno = EINVAL;
41 return 0;
42 }
43 auto *server = reinterpret_cast<sockaddr_in *>(addr);
44 memset(server, 0, sizeof(sockaddr_in));
45 server->sin_family = AF_INET;
46 server->sin_addr.s_addr = inet_addr(ip_address.c_str());
47 server->sin_port = htons(port);
48 return sizeof(sockaddr_in);
49}
50
51socklen_t set_sockaddr_any(struct sockaddr *addr, socklen_t addrlen, uint16_t port) {
52#if USE_NETWORK_IPV6
53 if (addrlen < sizeof(sockaddr_in6)) {
54 errno = EINVAL;
55 return 0;
56 }
57 auto *server = reinterpret_cast<sockaddr_in6 *>(addr);
58 memset(server, 0, sizeof(sockaddr_in6));
59 server->sin6_family = AF_INET6;
60 server->sin6_port = htons(port);
61 server->sin6_addr = IN6ADDR_ANY_INIT;
62 return sizeof(sockaddr_in6);
63#else
64 if (addrlen < sizeof(sockaddr_in)) {
65 errno = EINVAL;
66 return 0;
67 }
68 auto *server = reinterpret_cast<sockaddr_in *>(addr);
69 memset(server, 0, sizeof(sockaddr_in));
70 server->sin_family = AF_INET;
71 server->sin_addr.s_addr = ESPHOME_INADDR_ANY;
72 server->sin_port = htons(port);
73 return sizeof(sockaddr_in);
74#endif /* USE_NETWORK_IPV6 */
75}
76} // namespace socket
77} // namespace esphome
78#endif
uint8_t type
uint32_t socklen_t
Definition headers.h:97
std::unique_ptr< Socket > socket_ip(int type, int protocol)
Create a socket in the newest available IP domain (IPv6 or IPv4) of the given type and protocol.
Definition socket.cpp:13
std::unique_ptr< Socket > socket(int domain, int type, int protocol)
Create a socket of the given domain, type and protocol.
socklen_t set_sockaddr(struct sockaddr *addr, socklen_t addrlen, const std::string &ip_address, uint16_t port)
Set a sockaddr to the specified address and port for the IP version used by socket_ip().
Definition socket.cpp:21
socklen_t set_sockaddr_any(struct sockaddr *addr, socklen_t addrlen, uint16_t port)
Set a sockaddr to the any address and specified port for the IP version used by socket_ip().
Definition socket.cpp:51
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7