【发布时间】:2018-02-27 22:40:39
【问题描述】:
我一直在尝试这样做。我尝试关注此http://lua.2524044.n2.nabble.com/UDP-Broadcast-td3995269.html,但无济于事。我已经成功地在客户端和服务器之间发送了 单播 消息。我已经确认我的广播地址是正确的。我唯一能想到的另一件事是嗅探我的界面以确保没有网络问题。我明天会解决这个问题,但想在这里发布这个,看看是否有人会注意到一个愚蠢的错误。
注意:我在同一台笔记本电脑上运行客户端和服务器。
客户
local socket = require("socket")
local s_address, s_port = "192.168.1.135", 33333
local d_address, d_port = "192.168.1.255", 22222
udp = socket.udp()
assert(udp)
assert(udp:settimeout(1))
assert(udp:setoption('broadcast', true))
assert(udp:setoption('dontroute',true))
assert(udp:setsockname(s_address, s_port))
while true do
tosend = string.format("client %s:%s", s_address, s_port)
print(string.format('sending to %s:%s...', d_address, d_port))
udp:sendto(tosend, d_address, d_port)
data, msg = udp:receive()
toprint = string.format("data = \"%s\"", data)
print(toprint)
socket.sleep(.5)
end
服务器
local socket = require("socket")
local s_address, s_port = "192.168.1.135", 11111
local p_address, p_port = "192.168.1.255", 22222
udp = socket.udp()
assert(udp)
assert(udp:setoption('broadcast', true))
assert(udp:setoption('dontroute',true))
assert(udp:settimeout(1))
assert(udp:setsockname(s_address, s_port))
assert(udp:setpeername(p_address, p_port))
while true do
data = udp:receive()
print(string.format('listening on %s:%s...', p_address, p_port))
toprint = string.format("data = \"%s\"", data)
print(toprint)
if data then
msg_back = "server received your message"
udp:send(msg_back)
end
socket.sleep(.5)
end
输出
双方不断打印data = "nil"。
【问题讨论】:
-
如果你想在两个设备之间连接,为什么要使用广播,它旨在中断局域网上的每个主机。这似乎是对广播的滥用。如果你想中断每个主机,只使用广播,否则你应该使用单播或多播(对于多个主机)。
-
@RonMaupin 我想与多个主机通信,但现在我正在使用单个客户端和服务器进行测试(为简单起见)。
-
对,但是多播是您应该为一组多台主机使用的。广播适用于每个主机,而且大多数情况下被滥用,这也是 IPv6 没有广播的原因之一。
标签: networking lua udp broadcast luasocket