Networking golang:来自ioutil.ReadAll()的网络响应为空,由对等方重置连接
我正在尝试从设备模拟器执行一个简单的TCP MODBUS读取单个寄存器。当运行代码时,它显示一个0字节的响应,我得到消息“由对等方重置连接”。你知道为什么它不起作用吗 更新,我的请求不正确,正确的MODBUS TCP轮询代码为:Networking golang:来自ioutil.ReadAll()的网络响应为空,由对等方重置连接,networking,tcp,go,modbus,Networking,Tcp,Go,Modbus,我正在尝试从设备模拟器执行一个简单的TCP MODBUS读取单个寄存器。当运行代码时,它显示一个0字节的响应,我得到消息“由对等方重置连接”。你知道为什么它不起作用吗 更新,我的请求不正确,正确的MODBUS TCP轮询代码为: package main import ( "fmt" "net" ) // TCP MODBUS client func main() { conn, err := net.Dial("tcp", "192.168.98.114:502")
package main
import (
"fmt"
"net"
)
// TCP MODBUS client
func main() {
conn, err := net.Dial("tcp", "192.168.98.114:502")
if err != nil {
fmt.Println(err)
}
numRegs := 1
# make a MODBUS TCP request (be careful, the format is different to MODBUS serial)
request := []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, 0x03, 0x00, 0x01, 0x00, 0x01}
n, err := conn.Write(request)
if err != nil {
fmt.Println(err)
}
expectedResponseLen := 5 + 2 * numRegs
response := make([]byte, expectedResponseLen)
n, err = conn.Read(response)
conn.Close()
if err != nil {
fmt.Println(err)
}
for i := 0; i < n; i++ {
fmt.Printf("%02x ", response[i])
}
fmt.Println("\n")
}
主程序包
进口(
“fmt”
“净额”
)
//TCP MODBUS客户端
func main(){
连接,错误:=网络拨号(“tcp”,“192.168.98.114:502”)
如果错误!=零{
fmt.Println(错误)
}
numRegs:=1
#发出MODBUS TCP请求(注意,格式与MODBUS串行不同)
请求:=[]字节{0x00、0x00、0x00、0x00、0x00、0x06、0x01、0x03、0x00、0x01、0x00、0x01}
n、 错误:=conn.Write(请求)
如果错误!=零{
fmt.Println(错误)
}
预期响应元件:=5+2*numRegs
响应:=make([]字节,expectedResponseLen)
n、 err=conn.Read(响应)
康涅狄格州关闭
如果错误!=零{
fmt.Println(错误)
}
对于i:=0;i
最初,我认为fmt.Fprintf
可能会在退出时更改请求数据,但似乎工作正常
但是,我仍然建议使用较低级别的Write/Read
,而不是fmt.Fprintf/ioutil.ReadAll
:
req := []byte { 0x01, 0x03, 0x00, 0x01, 0x00, 0x01, 0xd5, 0xca }
n, err := conn.Write(req)
if err != nil {
fmt.Println("write error:", err)
return
}
fmt.Printf("wrote %d bytes for request: %#v", n, req)
rsp := make([]byte, 64)
n, err = conn.Read(rsp)
fmt.Printf("received %d bytes in response: %#v", n, rsp[:n])
if err != nil {
fmt.Println("read error:", err)
}
这似乎是一个与网络相关的问题,而不是代码的问题<代码>对等方重置连接可能是由于没有人监听该端口或服务出于某种原因没有接听您的呼叫。您检查了吗?
对等方重置连接
通常意味着客户端接受了连接,但在收到您的请求后挂断。也许请求有问题?(另外,我想你是想使用fmt.Fprint
)谢谢Tom,我的请求格式不正确,正确的代码现在在上面。我重新编写了代码以使用con.Write。我遇到的主要问题是我的请求包格式不正确。我已经用一个工作版本更新了帖子中的代码。