Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets luasocket从端口1900发送UDP数据_Sockets_Lua_Udp_Luasocket - Fatal编程技术网

Sockets luasocket从端口1900发送UDP数据

Sockets luasocket从端口1900发送UDP数据,sockets,lua,udp,luasocket,Sockets,Lua,Udp,Luasocket,我试图从我的家庭自动化控制器模拟Belkin wemo开关,从amazon Echo发送语音命令。该控制器支持lua语言 我正在跟进此操作,将UDP数据从控制器的端口1900发送到Echo的端口50000。现在,每次我发送数据时,套接字都会随机从端口1900发送数据。Echo仅在数据来自端口1900时建立有效连接并回复。过去两天我一直在挠头,想做点什么,但还没弄明白 下面是我的密码 strData1 = 'HTTP/1.1 200 OK' .. 'HOST: 239.255.255.25

我试图从我的家庭自动化控制器模拟Belkin wemo开关,从amazon Echo发送语音命令。该控制器支持lua语言

我正在跟进此操作,将UDP数据从控制器的端口1900发送到Echo的端口50000。现在,每次我发送数据时,套接字都会随机从端口1900发送数据。Echo仅在数据来自端口1900时建立有效连接并回复。过去两天我一直在挠头,想做点什么,但还没弄明白

下面是我的密码

strData1 =
  'HTTP/1.1 200 OK' .. 
 'HOST: 239.255.255.250:1900'..
 'CACHE-CONTROL: max-age=100'..
 'EXT:'..
 'LOCATION: http://192.168.1.152:49153/description.xml'..
 'SERVER: Linux/3.14.0 UPnP/1.0 IpBridge/1.19.0'..
 'hue-bridgeid: B8AC6FFFFEC53475'..
 'ST: upnp:rootdevice'..
 'USN: uuid:2f402f80-da50-11e1-9b23-b8ac6fc53475::upnp:rootdevice'

 local socket = require "socket"
 local udp = socket.udp()

 udp:settimeout(0)
 udp:setsockname('*', 1900)
 udp:setpeername('192.168.1.102', 50000) -- Echo IP and Port number
 udp:sendto(strData1,'192.168.1.102',50000)

你几乎做到了:当使用
setpeername
时,必须使用
send
而不是
sendto

另外,我猜这是一个输入错误,但您正在尝试发送
数据
,而不是
标准数据1
。以下是更正的版本:

strData1 =
  'HTTP/1.1 200 OK' .. 
 'HOST: 239.255.255.250:1900'..
 'CACHE-CONTROL: max-age=100'..
 'EXT:'..
 'LOCATION: http://192.168.1.152:49153/description.xml'..
 'SERVER: Linux/3.14.0 UPnP/1.0 IpBridge/1.19.0'..
 'hue-bridgeid: B8AC6FFFFEC53475'..
 'ST: upnp:rootdevice'..
 'USN: uuid:2f402f80-da50-11e1-9b23-b8ac6fc53475::upnp:rootdevice'

 local socket = require "socket"
 local udp = socket.udp()

 udp:settimeout(0)
 udp:setoption('reuseaddr',true)
 udp:setsockname('*', 1900)
 udp:setpeername('192.168.1.102', 50000) -- Echo IP and Port number
 udp:send(strData1)
Tcpdump的捕获显示源端口正确:


22:40:45.653222 IP my.super.secret.IP.1900>192.168.1.102.50000:UDP,长度280

首先,我建议您将所有
UDP
函数调用包装在
assert
中,以确保一切正常运行。其次,您已经将超时值设置为
0
,这意味着它每次都会超时。将其设置为正值
udp:settimeout(1)
,或者如果希望无限期阻止它,将其设置为nil。更改udp:settimeout(1)力有帮助。另外,在设置套接字名称(udp:setsockname('*',1900))时,我得到一个错误,它显示“地址已在使用”。如果系统正在运行,如何关闭套接字?基于此,您必须使用
close
功能。另外,我建议您将该函数与
select
结合使用,以获得一个包含套接字的列表,供读取,以及一个包含套接字的列表,供写入。@kingJulian“select”函数在哪里?它在链接中,但让我们把它交给您,因为您不向
send()
提供IP:port。关于发送/发送到的规则很奇怪。您可以在BSD套接字级别使用这两个端口,但如果已连接,则不向
sendto()
:提供IP:port,只提供一个空地址指针。可能这在LUA源代码中是不可能的。我在这一行“udp:setsockname('*',1900)”上遇到错误。上面写着“已经在1900端口上运行套接字”。我没有在端口1900上创建任何套接字。我不知道套接字名称,因此无法使用close()函数。如何获取正在运行的套接字列表?或者我们可以强制关闭1900端口上的插座吗?我在API中找不到任何内容:(@Prakash.DTI您必须使用close函数,并进行必要的调整以使其成为可能。通常,我们关闭之前启动的套接字,如…udp=Socket.udp(),然后使用udp:close()要关闭套接字,但当我执行“udp:setsockname('*',1900)”时,正在使用的系统是linux家庭自动化控制器。它表示套接字已在该端口上运行。如何获取套接字名称以在其上使用close()函数?看起来您已经有一个守护进程在该端口上侦听。请绑定您的私有ip(而不是*)或使守护进程在专用ip上侦听。或者,为了使其更简单,只需出于测试目的杀死这些进程。