mnet 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/lib/mnet/version.rb +1 -1
  3. data/lib/mnet.rb +11 -9
  4. metadata +1 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2024e36584d9a17b0671a60776e00d4cee60c0fae82fc940f293566a07f471c7
4
- data.tar.gz: 06d1487cb7206d21b62311c89f7e2419785346ebceb86995e79c185f698640e7
3
+ metadata.gz: 28c7a4caaa839184e561f720b57548ce98528405577180cd36419aaaad7f573d
4
+ data.tar.gz: 88a321feeed9a003e4dac10dceefa786d179d064b54c048235aaf0433ae95dd8
5
5
  SHA512:
6
- metadata.gz: 31c53f20db9e19f677e85452477000197e1f615bbf615a95d14faac1d84e9aa3045821eaa67302ebf6cf68f0ca3ed2e02f0af96b5e732affb84babe396296289
7
- data.tar.gz: f06da08c602b9f4bba472e2778cdba7fd1d4e163c0c09d4aa244f04d6d22ba3cacc29b11939e95d986b199991b2b33af98a6e4f17bd0b5a0cd85705dc73cb3db
6
+ metadata.gz: 1de03ebb7e9318e8e4b8867246c38ab80fa1570ce15465cfa0e649075db61dbf2e956e632b86c8693c1f5512570877e061e03e77bbc978427c3af6da13c22e90
7
+ data.tar.gz: a5c553a57c24bf513111b10656eef1bc2e48faa9fb79a8aae8ced04ab3c372a2718c7573e200d6feeb901cb83db8daf7f846d05e563d37f197c5214081bd739c
data/lib/mnet/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Mnet
4
- VERSION = '0.1.0'
4
+ VERSION = '0.1.1'
5
5
  end
data/lib/mnet.rb CHANGED
@@ -43,6 +43,9 @@ module Mnet
43
43
  # delayed packets (mosh: MAX_OLD_SOCKET_AGE = 60000ms).
44
44
  MAX_OLD_SOCKET_AGE = 60.0
45
45
 
46
+ # 非阻塞发送标志:POSIX 有 MSG_DONTWAIT,Windows 没有(用 nonblock 模式兜底)。
47
+ MSG_DONTWAIT = Socket.const_defined?(:MSG_DONTWAIT) ? Socket::MSG_DONTWAIT : 0
48
+
46
49
  # Message types (mirrors the enum-message-types pattern from tmux-protocol.h).
47
50
  TYPE_SYN = 0x01
48
51
  TYPE_SYNACK = 0x02
@@ -110,7 +113,7 @@ module Mnet
110
113
  # socketpair is unavailable (Windows).
111
114
  def socket_pair
112
115
  Socket.pair(:UNIX, :STREAM, 0)
113
- rescue Errno::EAFNOSUPPORT, Errno::EOPNOTSUPP, Errno::EPROTONOSUPPORT, Errno::ENOTSUP, NotImplementedError
116
+ rescue SystemCallError, NotImplementedError
114
117
  server = TCPServer.new("127.0.0.1", 0)
115
118
  port = server.addr[1]
116
119
  client = TCPSocket.new("127.0.0.1", port)
@@ -971,11 +974,9 @@ module Mnet
971
974
  def send_raw(data, ip, port)
972
975
  sock = @socks.last[0]
973
976
  @send_mutex.synchronize do
974
- sock.send(data, Socket::MSG_DONTWAIT, ip, port)
977
+ sock.send(data, Mnet::MSG_DONTWAIT, ip, port)
975
978
  true
976
- rescue IO::EAGAINWaitWritable, Errno::EAGAIN, Errno::EWOULDBLOCK, Errno::ENOBUFS
977
- false
978
- rescue IOError, Errno::EBADF, Errno::ECONNRESET, Errno::ECONNREFUSED
979
+ rescue IO::WaitWritable, IO::WaitReadable, SystemCallError, IOError
979
980
  false
980
981
  end
981
982
  end
@@ -999,6 +1000,9 @@ module Mnet
999
1000
 
1000
1001
  def configure_socket(sock)
1001
1002
  sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEADDR, true)
1003
+ # Windows 没有 MSG_DONTWAIT,用 nonblock 模式让 send 在缓冲满时返回错误
1004
+ # 而非阻塞(避免发送端死锁)。
1005
+ sock.nonblock = true if Mnet::MSG_DONTWAIT == 0
1002
1006
  # Request buffers sized for the receive window. Linux clamps these to
1003
1007
  # net.core.rmem_max/wmem_max, so read back the real value and cap the
1004
1008
  # flow-control window to what the kernel can actually buffer -- otherwise
@@ -1038,7 +1042,7 @@ module Mnet
1038
1042
  break if socks.empty?
1039
1043
  begin
1040
1044
  ready = IO.select(socks, nil, nil, 0.5)
1041
- rescue IOError, Errno::EBADF
1045
+ rescue IOError, SystemCallError
1042
1046
  break
1043
1047
  end
1044
1048
  next unless ready
@@ -1055,9 +1059,7 @@ module Mnet
1055
1059
  cap.times do
1056
1060
  data, addr = sock.recvfrom_nonblock(65_535)
1057
1061
  dispatch(data, addr)
1058
- rescue IO::WaitReadable, Errno::EAGAIN, Errno::EWOULDBLOCK
1059
- break
1060
- rescue IOError, Errno::EBADF, Errno::ECONNRESET
1062
+ rescue IO::WaitReadable, SystemCallError, IOError
1061
1063
  break
1062
1064
  rescue => e
1063
1065
  warn "mnet: #{e.class}: #{e.message}"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mnet
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - mnet developers