@@ -95,16 +95,21 @@ def daemon_cleanup():
95
95
class MultiListener :
96
96
97
97
def __init__ (self , type = socket .SOCK_STREAM , proto = 0 ):
98
- self .v6 = socket .socket (socket .AF_INET6 , type , proto )
99
- self .v4 = socket .socket (socket .AF_INET , type , proto )
98
+ self .type = type
99
+ self .proto = proto
100
+ self .v6 = None
101
+ self .v4 = None
102
+ self .bind_called = False
100
103
101
104
def setsockopt (self , level , optname , value ):
105
+ assert (self .bind_called )
102
106
if self .v6 :
103
107
self .v6 .setsockopt (level , optname , value )
104
108
if self .v4 :
105
109
self .v4 .setsockopt (level , optname , value )
106
110
107
111
def add_handler (self , handlers , callback , method , mux ):
112
+ assert (self .bind_called )
108
113
socks = []
109
114
if self .v6 :
110
115
socks .append (self .v6 )
@@ -119,6 +124,7 @@ def add_handler(self, handlers, callback, method, mux):
119
124
)
120
125
121
126
def listen (self , backlog ):
127
+ assert (self .bind_called )
122
128
if self .v6 :
123
129
self .v6 .listen (backlog )
124
130
if self .v4 :
@@ -133,16 +139,23 @@ def listen(self, backlog):
133
139
raise e
134
140
135
141
def bind (self , address_v6 , address_v4 ):
142
+ assert (not self .bind_called )
143
+ self .bind_called = True
136
144
if address_v6 and self .v6 :
145
+ self .v6 = socket .socket (socket .AF_INET6 , self .type , self .proto )
146
+ self .v6 .setsockopt (socket .SOL_SOCKET , socket .SO_REUSEADDR , 1 )
137
147
self .v6 .bind (address_v6 )
138
148
else :
139
149
self .v6 = None
140
150
if address_v4 and self .v4 :
151
+ self .v4 = socket .socket (socket .AF_INET , self .type , self .proto )
152
+ self .v4 .setsockopt (socket .SOL_SOCKET , socket .SO_REUSEADDR , 1 )
141
153
self .v4 .bind (address_v4 )
142
154
else :
143
155
self .v4 = None
144
156
145
157
def print_listening (self , what ):
158
+ assert (self .bind_called )
146
159
if self .v6 :
147
160
listenip = self .v6 .getsockname ()
148
161
debug1 ('%s listening on %r.\n ' % (what , listenip ))
@@ -569,11 +582,9 @@ def main(listenip_v6, listenip_v4,
569
582
for port in ports :
570
583
debug2 (' %d' % port )
571
584
tcp_listener = MultiListener ()
572
- tcp_listener .setsockopt (socket .SOL_SOCKET , socket .SO_REUSEADDR , 1 )
573
585
574
586
if required .udp :
575
587
udp_listener = MultiListener (socket .SOCK_DGRAM )
576
- udp_listener .setsockopt (socket .SOL_SOCKET , socket .SO_REUSEADDR , 1 )
577
588
else :
578
589
udp_listener = None
579
590
0 commit comments