linux 1900端口,luasocket从端口1900发送UDP数据(luasocket send UDP data from port 1900)

luasocket从端口1900发送UDP数据(luasocket send UDP data from port 1900)

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

我正在跟踪此文件 ,将UDP数据从Controller的1900端口发送到Echo的端口50000。 现在我每次发送数据时Socket都会随机端口发送数据而不是从端口1900发送数据。回显只做有效连接并回复数据是否来自端口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)

I am trying to Emulate Belkin wemo switch from my Home automation controller to send voice command from amazon Echo.The controller supports lua language.

I am following up this file to send the UDP data from port 1900 of Controller to port 50000 of Echo. right now every time i send the data the Socket take the random port send data not from port 1900. Echo only make valid connection and reply if the data comes from the port 1900. I am scratching my head from last two days to make is work but havent figured it out yet.

Bellow is my code.

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)

原文:https://stackoverflow.com/questions/48305020

更新时间:2019-12-13 02:42

最满意答案

你几乎就在那里: 文档声明当使用setpeername ,必须使用send而不是sendto 。

此外,我猜这是一个错字,但你试图发送Data而不是strData1 。 这是更正后的版本:

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, length 280

You were almost there: the documentation states that when using setpeername, send must be used instead of sendto.

Also, I guess it was a typo, but you are trying to send Data instead of strData1. Here is the corrected version:

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's capture shows that the source port is correct:

22:40:45.653222 IP my.super.secret.ip.1900 > 192.168.1.102.50000: UDP, length 280

2018-01-28

相关问答

可能有两个原因。 首先,接收者通常需要回复,为此提供标准工具是有用的。 其次,您可能有多个接口(网卡)并使用源地址,您可以决定必须使用哪些接口来发送数据包。 Probably, two reasons. First, receivers often need to reply and it is useful to provision a standard tool for that. Secondly, you may have multiple interfaces (network card

...

您不需要找到端口 - 只需在您用来发送的套接字上调用recv()或recvfrom() ,它就会使用相同的本地端口(当您执行sendto()时端口会被绑定)。 您也可以在发送套接字上调用getsockname()以查找用于信息目的的端口号,但是仍然应该使用发送套接字来接收 - 如果您不接受,则绑定套接字和返回响应之间存在争用条件从网络,可能会导致你失去回应。 You don't need to find the port - just call recv() or recvfrom() on th

...

你几乎就在那里: 文档声明当使用setpeername ,必须使用send而不是sendto 。 此外,我猜这是一个错字,但你试图发送Data而不是strData1 。 这是更正后的版本: 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/descript

...

那么recvfrom()函数呢? 它允许您获取数据并填充一个sockaddr结构体,您可以从中找到发件人的源端口。 What about the recvfrom() function? It allows you to grab the data and it fills a sockaddr struct from which you can find the source port of the sender.

将UdpClient放入using()语句而不是将其声明为私有字段,并通过将其放入短异步方法来限制其范围之后,我不再遇到这些问题了。 After putting UdpClient in a using () statement instead of declaring it as a private field, and limiting its scope by putting it in a short async method, I am not having these problems

...

请查看以下帖子。 希望它会对你有所帮助。 http://www.coderanch.com/t/434412/Android/Mobile/Android-Emulator-as-server-Socket 如何在Android中使用UDP接收数据? Please check below posts. Hope it will help you. http://www.coderanch.com/t/434412/Android/Mobile/Android-Emulator-as-server-

...

你不能只是“发送”你的课程。 您必须在班级中发送数据的表示 。 并且向您的班级发送指针也不起作用。 当网络上的另一个应用程序收到您的指针时,它们将毫无意义。 考虑一下: class Data

{

std::string name_;

unsigned value_;

} data;

你不能只是“发送课程”。 如果您尝试执行以下操作: send(&data, sizeof(data));

...你最终会向下游客户端发送废话。 value_可能会被正确接收,但是name_肯定不会。 这是

...

从单个父进程启动A和B. 父进程创建套接字并将其绑定到端口X.然后它会分叉,子进程继承此套接字。 其中一个进程然后执行A,另一个进程执行B.套接字的FD可以在argv传递给它们。 SO_REUSEPORT无法可靠运行的原因是因为每个套接字都有自己的输入队列。 当数据报到达端口时,操作系统会选择其中一个套接字并将消息放入其队列中。 如果它选择A使用的套接字,B将不会看到该消息。 我认为没有办法告诉操作系统其中一个插座仅用于发送而不是接收。 使用继承的套接字解决了这个问题,因为它只是一个套接字,所以只

...

这意味着你的scapy模块会改变你的端口......这有什么意义?! 我甚至不知道uap通信的“scapy”,不知道有什么理由将它用于python“socket”模块? 对于我通常使用的UDP传输 import socket

s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

s.bind(('192.168.66.33', 6022)) #bind local IP and Port

s.sendto("Calling device",

...

这里TCP和UDP没有区别。 在这两种情况下(客户端连接到服务器,路由器进行端口转发到服务器)都有NAT:网络地址转换。 如果我们以nat为后面的客户端和服务器的情况: 客户端发送数据包:srcip1,srcport1 - > dstip1,dstport1; 客户端的nat路由器翻译:srcip2,srcport2 - > dstip1,dstport1; 服务器的nat路由器翻译:srcip2,srcport2 - > dstip2,dstport2; 服务器接收数据包 当服务器发回数据包时会

...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值