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.
- checksums.yaml +4 -4
- data/lib/mnet/version.rb +1 -1
- data/lib/mnet.rb +11 -9
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 28c7a4caaa839184e561f720b57548ce98528405577180cd36419aaaad7f573d
|
|
4
|
+
data.tar.gz: 88a321feeed9a003e4dac10dceefa786d179d064b54c048235aaf0433ae95dd8
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 1de03ebb7e9318e8e4b8867246c38ab80fa1570ce15465cfa0e649075db61dbf2e956e632b86c8693c1f5512570877e061e03e77bbc978427c3af6da13c22e90
|
|
7
|
+
data.tar.gz: a5c553a57c24bf513111b10656eef1bc2e48faa9fb79a8aae8ced04ab3c372a2718c7573e200d6feeb901cb83db8daf7f846d05e563d37f197c5214081bd739c
|
data/lib/mnet/version.rb
CHANGED
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
|
|
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,
|
|
977
|
+
sock.send(data, Mnet::MSG_DONTWAIT, ip, port)
|
|
975
978
|
true
|
|
976
|
-
rescue IO::
|
|
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,
|
|
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,
|
|
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}"
|