我将开发一个像“桥”一样的软件:它将在一个端口上接收数据,以某种方式转换该数据,然后将数据从另一个端口发送回同一主机。 我打算使用下面的代码示例来测试网桥,但我目前还没有实际运行的网桥。
我的问题是为什么第一次拨打recv
trows Errno::ECONNRESET
?
目前没有远程UDP套接字将数据发送到端口6000,但由于这是UDP,我们不需要建立连接。
我只是希望recv
能够阻止。
require 'socket'
s = UDPSocket.new
s.bind('localhost', 6000)
s.connect('localhost', 7000)
begin
s.send('Bender, honey, we love you.', 0)
puts s.recv(1024)
rescue Errno::ECONNRESET
puts 'Shut up baby, I know it!'
end
puts 'The next recv will block like expected.'
s.recv(1024)
puts 'If you are reading this then there might be a problem...'
答案 0 :(得分:0)
如果套接字recv
上有错误,则不会阻止,但删除并返回错误。在这种情况下,数据包可能已发送,但在localhost:7000没有设置接收器,因此它返回ICMP无法访问。因此,将套接字错误设置为ECONNRESET
。