| Class | Jabber::Bytestreams::SOCKS5BytestreamsServer |
| In: |
lib/xmpp4r/bytestreams/helper/socks5bytestreams/server.rb
|
| Parent: | Object |
The SOCKS5BytestreamsServer is an implementation of a SOCKS5 server.
You can use it if you‘re reachable by your SOCKS5Bytestreams peers, thus avoiding use of an external proxy.
Start a local SOCKS5BytestreamsServer
Will start to listen on the given TCP port and accept new peers
| port: | [Fixnum] TCP port to listen on |
| listen_on: | [String] Optional address for the server socket to listen on (i.e. ‘0.0.0.0’ or ’::’) |
# File lib/xmpp4r/bytestreams/helper/socks5bytestreams/server.rb, line 27
27: def initialize(port, listen_on=nil)
28: @port = port
29: @addresses = []
30: @peers = []
31: @peers_lock = Mutex.new
32: if listen_on
33: socket = TCPServer.new(listen_on, port)
34: else
35: socket = TCPServer.new(port)
36: end
37:
38: Thread.new do
39: Thread.current.abort_on_exception = true
40: loop do
41: peer = SOCKS5BytestreamsPeer.new(socket.accept)
42: Thread.new do
43: Thread.current.abort_on_exception = true
44: begin
45: peer.start
46: rescue
47: Jabber::debuglog("SOCKS5 BytestreamsServer: Error accepting peer: #{$!}")
48: end
49: end
50: @peers_lock.synchronize do
51: @peers << peer
52: end
53: end
54: end
55: end
Add an external IP address
This is a must-have, as SOCKS5BytestreamsInitiator must inform the target where to connect
# File lib/xmpp4r/bytestreams/helper/socks5bytestreams/server.rb, line 104
104: def add_address(address)
105: @addresses << address
106: end
Iterate through all configured addresses, yielding SOCKS5BytestreamsServerStreamHost instances, which should be passed to SOCKS5BytestreamsInitiator#add_streamhost
This will be automatically invoked if you pass an instance of SOCKS5BytestreamsServer to SOCKS5BytestreamsInitiator#add_streamhost
| my_jid: | [JID] My Jabber-ID |
# File lib/xmpp4r/bytestreams/helper/socks5bytestreams/server.rb, line 118
118: def each_streamhost(my_jid, &block)
119: @addresses.each { |address|
120: yield SOCKS5BytestreamsServerStreamHost.new(self, my_jid, address, @port)
121: }
122: end
Find the socket a peer is associated to
This method also performs some housekeeping, ie. removing peers with closed sockets.
| addr: | [String] Address like SOCKS5Bytestreams#stream_address |
| result: | [TCPSocker] or [nil] |
# File lib/xmpp4r/bytestreams/helper/socks5bytestreams/server.rb, line 64
64: def peer_sock(addr)
65: res = nil
66: @peers_lock.synchronize {
67: removes = []
68:
69: @peers.each { |peer|
70: if peer.socket and peer.socket.closed?
71: # Queue peers with closed socket for removal
72: removes << peer
73: elsif peer.address == addr and res.nil?
74: res = peer.socket
75: end
76:
77: # If we sent multiple addresses of our own, clients may
78: # connect multiple times. DO NOT close any other connections
79: # here. These may belong to other concurrent bytestreams,
80: # believe that the peer will close any unneeded sockets
81: # which will then be picked up by the next call to peer_sock.
82: }
83:
84: # If we sent multiple addresses of our own, clients may
85: # connect multiple times. Close these connections here.
86: @peers.delete_if { |peer|
87: if removes.include? peer
88: peer.socket.close rescue IOError
89: true
90: else
91: false
92: end
93: }
94: }
95:
96: res
97: end