@@ -33,8 +33,10 @@ def type?
33
33
'udp'
34
34
end
35
35
36
- def recvfrom_nonblock ( length , flags = nil )
37
- return [ super ( length , flags ) [ 0 ] , super ( length , flags ) [ 0 ] ]
36
+ def recvfrom_nonblock ( length , flags = 0 )
37
+ data = super ( length , flags ) [ 0 ]
38
+ sockaddr = super ( length , flags ) [ 0 ]
39
+ [ data , sockaddr ]
38
40
end
39
41
40
42
def send ( buf , flags , saddr )
@@ -53,17 +55,12 @@ def dio_write_handler(packet, data)
53
55
)
54
56
55
57
if peerhost && peerport
56
- # Maxlen here is 65507, to ensure we dont overflow, we need to write twice
57
- # If the other side has a full 64k, handle by splitting up the datagram and
58
- # writing multiple times along with the sockaddr. Consumers calling recvfrom
59
- # repeatedly will buffer up all the pieces.
60
- while data . length > 65507
61
- rsock . syswrite ( data [ 0 ..65506 ] )
62
- rsock . syswrite ( Rex ::Socket . to_sockaddr ( peerhost , peerport ) )
63
- data = data - data [ 0 ..65506 ]
64
- end
65
- rsock . syswrite ( data )
66
- rsock . syswrite ( Rex ::Socket . to_sockaddr ( peerhost , peerport ) )
58
+ # A datagram can be maximum 65507 bytes, truncate longer messages
59
+ rsock . syswrite ( data [ 0 ..65506 ] )
60
+
61
+ # We write the data and sockaddr data to the local socket, the pop it
62
+ # back in recvfrom_nonblock.
63
+ rsock . syswrite ( Rex ::Socket . to_sockaddr ( peerhost , peerport ) )
67
64
return true
68
65
else
69
66
return false
0 commit comments