dango 0.0.22 → 0.0.23

Sign up to get free protection for your applications and to get access to all the features.
@@ -138,8 +138,8 @@ module DangoFrameworkModule
138
138
  # size_str = sock.readpartial(CommMaxDigit + 1)
139
139
  # size_str = sock.sysread(CommMaxDigit + 1)
140
140
  size_str = sock.recv(CommMaxDigit + 1)
141
- rescue EOFError, Errno::ECONNRESET, Errno::ETIMEDOUT
142
- # EOFErrorはその接続終了時の切断と思われるのでDangoFrameworkConnectionErrorにしない
141
+ rescue EOFError, IOError, Errno::ECONNRESET, Errno::ETIMEDOUT, Errno::ECONNABORTED
142
+ # 接続終了時の切断と思われるものはDangoFrameworkConnectionErrorにしない
143
143
  #raise(DangoFrameworkError, "failed to read sock for EOF reached.\n#{error_message($!, 'u')}")
144
144
  raise(DangoFrameworkError, "failed to read sock for EOF reached (and so on). #{$!.class} toid=#{Thread.current.object_id}")
145
145
  rescue
@@ -240,7 +240,7 @@ module DangoFrameworkModule
240
240
 
241
241
  # if size >= 4294967296 # 本当はuint最大値なんだけれど、policyファイルの都合で変えてある
242
242
  if size >= 1886350440
243
- raise(DangoFrameworkError, "max size over. size:#{size} >= 4294967296")
243
+ raise(DangoFrameworkError, "max size over. size:#{size} >= 1886350440")
244
244
  end
245
245
 
246
246
  # size_str = sprintf("%0#{CommMaxDigit}d", size)
@@ -255,17 +255,17 @@ module DangoFrameworkModule
255
255
  sock.write send_buf
256
256
  sock.flush
257
257
 
258
- # sock.send(size_str + "\n", 0)
258
+ # sock.send(send_buf, 0)
259
259
  # sock.flush
260
260
 
261
- # sock.send(send_data, 0)
262
- # sock.flush
263
261
  rescue
264
262
  raise(DangoFrameworkConnectionError, "sock write failed.\n#{error_message($!, 'u')}")
265
263
  end
266
264
 
267
265
  @send_count += 1 if @send_count # 受信回数カウント
268
266
  # cs_logger.debug "finish send_data:#{send_data.inspect}"
267
+ # cs_logger.debug "finish send_data:#{Time.now_to_s}:toid=#{Thread.current.object_id} #{sock} #{sock.closed?}"
268
+
269
269
  sock
270
270
  end
271
271
  end
@@ -19,7 +19,8 @@ class DangoServerFramework
19
19
  SendReceiveSleepIntervalSec = 0.2 # データ送信後の順の際のタイムアウトチェック間隔秒
20
20
  SendReceiveTimeoutDefaultSec = 2.0 # データ送受信時のデフォルトタイムアウト秒数
21
21
  SendTimeoutSec = 10.0 # データ送受信時の送信のタイムアウト秒数
22
- HeratBeatIntervalSec = 60.0 # S=>Cのハートビートの送信タイミング
22
+ HeratBeatIntervalSec = 60.0 # S=>Cのheart beatの送信タイミング
23
+ HeratBeatResponseWaitlSec = 20.0 # S=>Cのheart beatの返信待ちタイミング
23
24
 
24
25
  class DangoGServer < GServer
25
26
  def initialize(parent, *args)
@@ -170,7 +171,8 @@ class DangoServerFramework
170
171
 
171
172
  # gserver接続開始処理
172
173
  def connecting(sock)
173
- cs_logger.debug "connecting:sock=#{sock}"
174
+ cs_logger.debug "connecting:sock=#{sock} peeraddr=#{sock.peeraddr.inspect} addr=#{sock.addr.inspect}"
175
+ # cs_logger.debug "getpeername=#{Socket.unpack_sockaddr_in(sock.getpeername).inspect} getsockname=#{Socket.unpack_sockaddr_in(sock.getsockname).inspect}"
174
176
  end
175
177
 
176
178
  # gserver接続開始処理
@@ -521,9 +523,10 @@ class DangoServerFramework
521
523
 
522
524
  # 全員へ空パケットを送信
523
525
  socket_list.keys.each do |sid|
524
- cs_logger.debug "heart_beat_thread_start:sid=#{sid}"
525
526
  sock = socket_list[sid]
526
- cs_send_data(sock, {})
527
+ cs_logger.debug "heart_beat_thread_start:sid=#{sid} #{sock} #{sock.closed?}"
528
+ # cs_send_data(sock, {})
529
+ cs_server_send_data(sid, "_heart_beat", {}, {:timeout=>HeratBeatResponseWaitlSec})
527
530
  end
528
531
  end
529
532
 
@@ -544,9 +547,14 @@ class DangoServerFramework
544
547
  timeout = options[:timeout] || SendReceiveTimeoutDefaultSec
545
548
  dtype = options[:type] || 0
546
549
 
550
+ sock = socket_list[sid]
551
+ if !sock # sockがないという事はすでに切断済み
552
+ cs_logger.info "cs_server_send_data:already closed socket. sid=#{sid.inspect} sock=#{sock.inspect} #{Time.now_to_s}"
553
+ return
554
+ end
555
+
547
556
  # sidの通知の場合はレスポンスを気にしない
548
557
  if notice_name.to_s == "_notice_sid"
549
- sock = socket_list[sid]
550
558
  raise(DangoFrameworkError, "not found sid=#{sid}") if !sock
551
559
  raise(DangoFrameworkConnectionError, "socket closed. sid=#{sid}") if sock.closed?
552
560
 
@@ -556,9 +564,8 @@ class DangoServerFramework
556
564
  cs_send_data(sock, send_obj_dup, :type=>dtype) # データ送信
557
565
  # cs_logger.debug "cs_server_send_data:finish send data notice_name=#{notice_name.inspect}\n"
558
566
  else
559
- Thread.start(sid, notice_name, send_obj, dtype, timeout) do
567
+ Thread.start(sid, notice_name, send_obj, dtype, timeout, sock) do
560
568
  begin
561
- sock = socket_list[sid]
562
569
  raise(DangoFrameworkError, "not found sid=#{sid}") if !sock
563
570
  raise(DangoFrameworkConnectionError, "socket closed. sid=#{sid}") if sock.closed?
564
571
 
@@ -596,6 +603,11 @@ class DangoServerFramework
596
603
  (timeout.to_f / SendReceiveSleepIntervalSec).to_i.times do
597
604
  if Time.now > end_reserved_time
598
605
  cs_logger.debug "cs_server_send_data:receive timeout:#{notice_name}"
606
+
607
+ if notice_name.to_s == "_heart_beat" # heart beatだったらsockを止める
608
+ cs_logger.info "!!!! cs_server_send_data:heart_beat timeout"
609
+ sock.close if !sock.closed?
610
+ end
599
611
  break
600
612
  end
601
613
 
@@ -603,6 +615,8 @@ class DangoServerFramework
603
615
  find_res = @arr_send_response.find{|r| r[:_id] == send_obj_dup["_id"]}
604
616
 
605
617
  if find_res
618
+ cs_logger.debug "cs_server_send_data:find_res _heart_beat #{sid}" if notice_name.to_s == "_heart_beat"
619
+
606
620
  @arr_send_response.delete(find_res)
607
621
  have_came_response = true
608
622
  throw(:send_timeout)
@@ -29,7 +29,8 @@ class SocketList
29
29
 
30
30
  def [](key)
31
31
  @sl_mutex.synchronize do
32
- raise("not exist key(#{key.inspect})") if ! @sl_hash.has_key?(key)
32
+ # raise("not exist key(#{key.inspect})") if ! @sl_hash.has_key?(key)
33
+ return(nil) if ! @sl_hash.has_key?(key)
33
34
  @sl_hash[key]
34
35
  end
35
36
  end
data/lib/dango/version.rb CHANGED
@@ -2,7 +2,7 @@ module Dango #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 0
5
- TINY = 22
5
+ TINY = 23
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.4
3
3
  specification_version: 1
4
4
  name: dango
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.0.22
7
- date: 2007-10-29 00:00:00 +09:00
6
+ version: 0.0.23
7
+ date: 2007-10-30 00:00:00 +09:00
8
8
  summary: Realtime communications network framework for Ruby and Flash on Rails.
9
9
  require_paths:
10
10
  - lib