2
0
Эх сурвалжийг харах

High throughput root stuff

Adam Ierymenko 6 жил өмнө
parent
commit
c0c9590904
1 өөрчлөгдсөн 52 нэмэгдсэн , 8 устгасан
  1. 52 8
      root/root.cpp

+ 52 - 8
attic/root.cpp → root/root.cpp

@@ -24,7 +24,7 @@
  * of your own application.
  */
 
-#include "node/Constants.hpp"
+#include "../node/Constants.hpp"
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -45,13 +45,43 @@
 #include <netinet/ip6.h>
 #include <netinet/tcp.h>
 
+#include "../node/Packet.hpp"
+#include "../node/Utils.hpp"
+#include "../node/Address.hpp"
+#include "../node/Identity.hpp"
+#include "../node/InetAddress.hpp"
+#include "../node/Mutex.hpp"
+#include "../osdep/OSUtils.hpp"
+
 #include <string>
 #include <thread>
 #include <map>
 #include <vector>
 #include <iostream>
+#include <unordered_map>
+#include <vector>
+
+using namespace ZeroTier;
+
+struct PeerInfo
+{
+	InetAddress address;
+	int64_t lastReceive;
+};
 
-#include "include/ZeroTierOne.h"
+struct AddressHasher { ZT_ALWAYS_INLINE std::size_t operator()(const Address &a) const { return (std::size_t)a.toInt(); } };
+struct InetAddressHasher { ZT_ALWAYS_INLINE std::size_t operator()(const InetAddress &ip) const { return (std::size_t)ip.hashCode(); } };
+
+static std::unordered_map< Address,std::map< Identity,PeerInfo >,AddressHasher > peersByVirtAddr;
+static std::unordered_map< InetAddress,std::map< Identity,PeerInfo >,InetAddressHasher > peersByPhysAddr;
+static Mutex peersByVirtAddr_l;
+static Mutex peersByAddress_l;
+
+static void handlePacket(const InetAddress *const ip,const Packet *const pkt)
+{
+	char stmp[128];
+	printf("%s\n",ip->toString(stmp));
+}
 
 static int bindSocket(struct sockaddr *bindAddr)
 {
@@ -131,25 +161,39 @@ int main(int argc,char **argv)
 
 		threads.push_back(std::thread([s6]() {
 			struct sockaddr_in6 in6;
-			char buf[10000];
+			Packet pkt;
 			memset(&in6,0,sizeof(in6));
 			for(;;) {
 				socklen_t sl = sizeof(in6);
-				const int pl = (int)recvfrom(s6,buf,sizeof(buf),0,(struct sockaddr *)&in6,&sl);
+				const int pl = (int)recvfrom(s6,pkt.unsafeData(),pkt.capacity(),0,(struct sockaddr *)&in6,&sl);
 				if (pl > 0) {
-				} else break;
+					try {
+						pkt.setSize((unsigned int)pl);
+						handlePacket(reinterpret_cast<const InetAddress *>(&in6),&pkt);
+					} catch ( ... ) {
+					}
+				} else {
+					break;
+				}
 			}
 		}));
 
 		threads.push_back(std::thread([s4]() {
 			struct sockaddr_in in4;
-			char buf[10000];
+			Packet pkt;
 			memset(&in4,0,sizeof(in4));
 			for(;;) {
 				socklen_t sl = sizeof(in4);
-				const int pl = (int)recvfrom(s4,buf,sizeof(buf),0,(struct sockaddr *)&in4,&sl);
+				const int pl = (int)recvfrom(s4,pkt.unsafeData(),pkt.capacity(),0,(struct sockaddr *)&in4,&sl);
 				if (pl > 0) {
-				} else break;
+					try {
+						pkt.setSize((unsigned int)pl);
+						handlePacket(reinterpret_cast<const InetAddress *>(&in4),&pkt);
+					} catch ( ... ) {
+					}
+				} else {
+					break;
+				}
 			}
 		}));
 	}