Class: DeepConnect::Port

Inherits:
Object show all
Defined in:
lib/deep-connect/port.rb

Constant Summary collapse

PACK_n_SIZE =
[1].pack("n").size
PACK_N_SIZE =
[1].pack("N").size

Instance Method Summary collapse

Constructor Details

#initialize(sock) ⇒ Port

Returns a new instance of Port.



20
21
22
23
24
# File 'lib/deep-connect/port.rb', line 20

def initialize(sock)
  @io = sock
  @peeraddr = @io.peeraddr
  @session = nil
end

Instance Method Details

#addrObject



34
35
36
# File 'lib/deep-connect/port.rb', line 34

def addr
  @io.addr
end

#attach(session) ⇒ Object



42
43
44
# File 'lib/deep-connect/port.rb', line 42

def attach(session)
  @session = session
end

#closeObject



26
27
28
# File 'lib/deep-connect/port.rb', line 26

def close
  @io.close
end

#export(ev) ⇒ Object



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/deep-connect/port.rb', line 94

def export(ev)
  puts "EXPORT: #{ev.inspect}" if Conf.MESSAGE_DISPLAY
  begin
	bin = Marshal.dump(ev.serialize)
  rescue
	puts "Exception Rised: #{$!}"
	puts $@
	p ev.serialize
	raise
  end
  size = bin.size

  packet = [size].pack("N")+bin
  write(packet)
  puts "EXPORT: finsh" if Conf.MESSAGE_DISPLAY
end

#export2(ev) ⇒ Object



84
85
86
87
88
89
90
91
92
# File 'lib/deep-connect/port.rb', line 84

def export2(ev)
  puts "EXPORT: #{ev.inspect}" if Conf.MESSAGE_DISPLAY
  bin = Marshal.dump(ev.serialize, @io)
#      size = bin.size

#      packet = [size].pack("N")+bin
#      write(packet)
  puts "EXPORT: finsh" if Conf.MESSAGE_DISPLAY
end

#importObject



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/deep-connect/port.rb', line 62

def import
#      puts "IMPORT: start0" 
  sz = read(PACK_N_SIZE).unpack("N").first
  bin = read(sz)
  begin
	a = Marshal.load(bin)
  rescue
	p bin
	p $!, $@
	raise
  end
  begin
	# ここで, ネットワーク通信発生する可能性あり.
	ev = Event.materialize(@session, a.first, *a)
  rescue
	p $!, $@
	raise
  end
  puts "IMPORT: #{ev.inspect}" if Conf.MESSAGE_DISPLAY
  ev
end

#import2Object



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/deep-connect/port.rb', line 46

def import2
#      puts "IMPORT: start0" 
#      sz = read(PACK_N_SIZE).unpack("N").first
#      bin = read(sz)
  a = Marshal.load(@io)
  begin
	# ijijć, ōŃňů|ůČ??8Ĺī??-ĢĪ.
	ev = Event.materialize(@session, a.first, *a)
  rescue
	p $!, $@
	raise
  end
  puts "IMPORT: #{ev.inspect}" if Conf.MESSAGE_DISPLAY
  ev
end

#peeraddrObject



38
39
40
# File 'lib/deep-connect/port.rb', line 38

def peeraddr
  @peeraddr
end

#read(n) ⇒ Object

def export(ev)

  puts "EXPORT: #{ev.inspect}" if Conf.MESSAGE_DISPLAY
  s = Marshal.dump(ev.serialize)
  size = s.size
  packet = [size, s].pack("Na#{size}")
  write(packet)
end


128
129
130
131
132
133
134
135
136
137
138
139
140
# File 'lib/deep-connect/port.rb', line 128

def read(n)
  begin
	packet = @io.read(n)
	fail EOFError, "socket closed" unless packet
#	DC::Raise ProtocolError unless packet.size == n
	packet
  rescue Errno::ECONNRESET, EOFError
	unless Conf.DISABLE_INFO
	  puts "WARN: read中に[#{peeraddr.join(', ')}]の接続が切れました"
	end
	DC::Raise DisconnectClient, peeraddr
  end
end

#shutdown_readingObject



30
31
32
# File 'lib/deep-connect/port.rb', line 30

def shutdown_reading
  @io.shutdown(Socket::SHUT_RD)
end

#write(packet) ⇒ Object



142
143
144
145
146
147
148
149
150
151
152
# File 'lib/deep-connect/port.rb', line 142

def write(packet)
  begin
	@io.write(packet)
#	@io.flush
  rescue Errno::ECONNRESET
	unless Conf.DISABLE_INFO
	  puts "WARN: write中に[#{peeraddr.join(', ')}]の接続が切れました"
	end
	DC::Raise DisconnectClient, peeraddr
  end
end