/
trumma.py
75 lines (61 loc) · 2.34 KB
/
trumma.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
74
75
# -*- coding: utf8 -*-
import struct
import pdb
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import gevent
from gevent import socket
from gevent.server import StreamServer, DatagramServer
from gevent import Greenlet
import settings
import datagram
from connection import handle_connection
from ui import run_ui
from peerlist import Peer, AvailableFile, share_files_from_folder
from peerlist import decrement_other_peers_files_ttl, peerlist
peerlist.self_peer = Peer(settings.LOOPBACK_IP_ADDRESS)
peerlist.self_peer.tcp_port = settings.TCP_PORT
peerlist.self_peer.alias = settings.ALIAS
peerlist.append(peerlist.self_peer)
# build own file list
for s in settings.SHARE:
share_files_from_folder(s)
# decrement the TTL of all other peer's files every second
Greenlet.spawn(decrement_other_peers_files_ttl)
# On Linux, binding TCP to in6addr_any will also listen on IPv4
connection_server = StreamServer((settings.IPV6_BIND_INTERFACE,
settings.TCP_PORT), handle_connection)
connection_server.family = socket.AF_INET6
connection_server.init_socket()
connection_server.start()
# Set up the v4 UDP server
ipv4_datagram_server = datagram.TrummaDatagramServer(
settings.IPV4_MULTICAST_GROUP,
(settings.IPV4_BIND_INTERFACE, settings.UDP_PORT))
# Modify some private (?) members to make it join the multicast group
ipv4_datagram_server.init_socket()
ipv4_datagram_server.socket.setsockopt(socket.IPPROTO_IP,
socket.IP_ADD_MEMBERSHIP,
socket.inet_pton(socket.AF_INET, settings.IPV4_MULTICAST_GROUP) +
struct.pack('=I', socket.INADDR_ANY))
ipv4_datagram_server.start()
# Set up the v6 UDP server
ipv6_datagram_server = datagram.TrummaDatagramServer(
settings.IPV6_MULTICAST_GROUP,
(settings.IPV6_BIND_INTERFACE, settings.UDP_PORT))
ipv6_datagram_server.family = socket.AF_INET6
ipv6_datagram_server.init_socket()
ipv6_datagram_server.socket.setsockopt(socket.IPPROTO_IPV6,
socket.IPV6_JOIN_GROUP,
socket.inet_pton(socket.AF_INET6, settings.IPV6_MULTICAST_GROUP) +
struct.pack('=I', 0))
ipv6_datagram_server.start()
datagram.datagram_servers.append(ipv4_datagram_server)
datagram.datagram_servers.append(ipv6_datagram_server)
gevent.sleep(0.2)
datagram.send_hi_message_to_multicast_group()
Greenlet.spawn(run_ui()).join()
connection_server.stop()
ipv4_datagram_server.stop()
ipv6_datagram_server.stop()