summaryrefslogtreecommitdiff
path: root/src/compat.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/compat.cc')
-rw-r--r--src/compat.cc57
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