-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathseeder.py
73 lines (66 loc) · 1.74 KB
/
seeder.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
from Node import Seeder
import socket as s
import threading as th
import json
import time
S=s.socket(s.AF_INET,s.SOCK_DGRAM)
HOST=s.gethostbyname(s.gethostname())
S.setsockopt(s.SOL_SOCKET,s.SO_REUSEADDR,1)
S.bind((HOST,6969))
peer_threads={}
sockets=[]
seeder=Seeder(3)
def refresh(soc,chain,addr):
try:
soc.sendto(json.dumps(chain).encode(),addr)
return True
except OSError as e:
return False
def seed(soc,addr):
msg="ORA ORA ORA".encode()
flag,number=seeder.allocate_number()
soc.sendto(json.dumps(number).encode(),addr)
print(soc)
if(type(number)==int):
answer,ans_addr=soc.recvfrom(40)###NEED ANSWERING IP
print(answer,ans_addr)
if(answer):
seeder.init_connection(addr)
soc.sendto(json.dumps(seeder.size).encode(),ans_addr)
flag=refresh(soc,seeder.get_chain(),ans_addr)
if(not flag):
#Something error
print("FLAG ERROR",flag)
else:
soc.close()
print("NO ANSWER FROM PEER")
time1=time.time()
while True:
try:
if(time.time()-time1>=5):
soc.sendto("CHAIN".encode(),ans_addr)
chain,_=soc.recvfrom(2048)
chain=chain.decode()
print(chain,"\t FROM PEER",number)
seeder.update_chain(chain,number)
refresh(soc,seeder.get_chain(),ans_addr)
print("CHAIN UPDATE")
time1=time.time()
else:
soc.sendto(msg,ans_addr)
print(soc.recvfrom(1024),"IN THREAD",sep="\t")
time.sleep(0.2)
except OSError as e:
print(e)
while True:
thread=[]
try:
data,addr=S.recvfrom(1024)
print(data,addr,"IN MAIN",sep="\t")
if(addr not in peer_threads.keys()):
sockets.append(s.socket(s.AF_INET,s.SOCK_DGRAM))
sockets[-1].setsockopt(s.SOL_SOCKET,s.SO_REUSEADDR,1)
thread.append(th.Thread(target=seed,args=(sockets[-1],addr,)))
thread[-1].start()
except:
pass