diff options
Diffstat (limited to 'src/compat.cc')
| -rw-r--r-- | src/compat.cc | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/src/compat.cc b/src/compat.cc new file mode 100644 index 0000000..e8d5caa --- /dev/null +++ b/src/compat.cc @@ -0,0 +1,57 @@ +/* + * \brief C库接口封装 + * + * \author Qiuwen Lu<[email protected]> + * \date 2018-5-23 + */ + +#include <cassert> +#include <sys/socket.h> +#include "compat.h" + +sapp_ip_addr_ptr_t sockaddr_to_sapp_ipaddr(const struct sockaddr * sk_addr_src, + const struct sockaddr * sk_addr_dst) +{ + assert(sk_addr_src->sa_family == sk_addr_dst->sa_family); + + /* sapp_ip_addr智能指针封装,超出作用域自动析构 */ + sapp_ip_addr_ptr_t __sapp_ip_addr(new struct ipaddr); + auto sa_family = sk_addr_src->sa_family; + + /* IPv4 */ + if (sa_family == AF_INET) + { + __sapp_ip_addr->addrtype = ADDR_TYPE_IPV4; + __sapp_ip_addr->v4 = new stream_tuple4_v4; + + auto * __v4_ptr = __sapp_ip_addr->v4; + auto * __sk_in_src = (struct sockaddr_in *)(sk_addr_src); + auto * __sk_in_dst = (struct sockaddr_in *)(sk_addr_dst); + + __v4_ptr->saddr = static_cast<UINT32>(__sk_in_src->sin_addr.s_addr); + __v4_ptr->daddr = static_cast<UINT32>(__sk_in_dst->sin_addr.s_addr); + __v4_ptr->source = static_cast<UINT16>(__sk_in_src->sin_port); + __v4_ptr->dest = static_cast<UINT16>(__sk_in_dst->sin_port); + } + /* IPv6 */ + else if(sa_family == AF_INET6) + { + __sapp_ip_addr->addrtype = ADDR_TYPE_IPV6; + __sapp_ip_addr->v6 = new stream_tuple4_v6; + + auto * __v6_ptr = __sapp_ip_addr->v6; + auto * __sk_in6_src = (struct sockaddr_in6 *)(sk_addr_src); + auto * __sk_in6_dst = (struct sockaddr_in6 *)(sk_addr_dst); + + memcpy(__v6_ptr->saddr, __sk_in6_src->sin6_addr.s6_addr, IPV6_ADDR_LEN); + memcpy(__v6_ptr->daddr, __sk_in6_dst->sin6_addr.s6_addr, IPV6_ADDR_LEN); + __v6_ptr->source = static_cast<UINT16>(__sk_in6_src->sin6_port); + __v6_ptr->dest = static_cast<UINT16>(__sk_in6_dst->sin6_port); + } + else + { + assert(0); + } + + return std::move(__sapp_ip_addr); +}
\ No newline at end of file |
