1
This commit is contained in:
1 parent
1a171d5a24
commit
8bad15b7bb
7 files changed
+91
-19
No files matched your search
@@ -57,6 +57,49 @@ ip_str_t ip_to_str(const void *addr, int family) {
|
||||
return result;
|
||||
}
|
||||
|
||||
ip_str_t sockaddr_storage_to_str(const struct sockaddr_storage *addr) {
|
||||
ip_str_t result;
|
||||
result.str[0] = '\0';
|
||||
|
||||
if (!addr) {
|
||||
return result;
|
||||
}
|
||||
|
||||
char ip_buf[INET6_ADDRSTRLEN];
|
||||
ip_buf[0] = '\0';
|
||||
|
||||
uint16_t port = 0;
|
||||
void *src = NULL;
|
||||
|
||||
if (addr->ss_family == AF_INET) {
|
||||
const struct sockaddr_in *ipv4 = (const struct sockaddr_in *)addr;
|
||||
src = (void *)&ipv4->sin_addr;
|
||||
port = ntohs(ipv4->sin_port);
|
||||
}
|
||||
else if (addr->ss_family == AF_INET6) {
|
||||
const struct sockaddr_in6 *ipv6 = (const struct sockaddr_in6 *)addr;
|
||||
src = (void *)&ipv6->sin6_addr;
|
||||
port = ntohs(ipv6->sin6_port);
|
||||
}
|
||||
else {
|
||||
return result;
|
||||
}
|
||||
|
||||
if (!inet_ntop(addr->ss_family, src, ip_buf, sizeof(ip_buf))) {
|
||||
return result;
|
||||
}
|
||||
|
||||
if (addr->ss_family == AF_INET6) {
|
||||
// IPv6 обязательно в []
|
||||
snprintf(result.str, sizeof(result.str), "[%s]:%u", ip_buf, port);
|
||||
} else {
|
||||
snprintf(result.str, sizeof(result.str), "%s:%u", ip_buf, port);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static const struct {
|
||||
const char* name;
|
||||
|
||||
+2
-1
@@ -111,10 +111,11 @@ void debug_enable_console(int enable);
|
||||
|
||||
// IP address to string (static buffer, single-threaded)
|
||||
typedef struct {
|
||||
char str[48]; // INET6_ADDRSTRLEN(45) + \0
|
||||
char str[54]; // INET6_ADDRSTRLEN(45) + 6chars (:port) + \0
|
||||
} ip_str_t;
|
||||
|
||||
ip_str_t ip_to_str(const void *addr, int family);// big endian addr
|
||||
ip_str_t sockaddr_storage_to_str(const struct sockaddr_storage *addr);// автоопределение v4 или v6
|
||||
|
||||
// hex dump в лог
|
||||
void log_dump(const char* prefix, const uint8_t* data, size_t len);
|
||||
|
||||
@@ -230,3 +230,18 @@ ssize_t socket_recvfrom(socket_t sock, void* buf, size_t len,
|
||||
return recvfrom(sock, buf, len, 0, src, src_len);
|
||||
#endif
|
||||
}
|
||||
|
||||
uint16_t ss_get_port(const struct sockaddr_storage *addr) {
|
||||
if (!addr) return 0;
|
||||
|
||||
if (addr->ss_family == AF_INET) {
|
||||
const struct sockaddr_in *ipv4 = (const struct sockaddr_in *)addr;
|
||||
return ntohs(ipv4->sin_port);
|
||||
}
|
||||
else if (addr->ss_family == AF_INET6) {
|
||||
const struct sockaddr_in6 *ipv6 = (const struct sockaddr_in6 *)addr;
|
||||
return ntohs(ipv6->sin6_port);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -69,4 +69,7 @@ ssize_t socket_recvfrom(socket_t sock, void* buf, size_t len,
|
||||
// Utility
|
||||
const char* socket_strerror(int err);
|
||||
|
||||
// взять порт из sockaddr_storage
|
||||
uint16_t ss_get_port(const struct sockaddr_storage *addr);
|
||||
|
||||
#endif // SOCKET_COMPAT_H
|
||||
Reference in new issue
Block a user