英文:
golang : network response from ioutil.ReadAll() is empty, connection reset by peer
问题
我正在尝试测试从设备模拟器中执行简单的TCP MODBUS读取单个寄存器的操作。运行代码时,显示的响应是0字节,并出现"connection reset by peer"的消息。有任何关于为什么它不起作用的想法吗?
更新,我的请求是不正确的,正确的工作MODBUS TCP轮询代码如下:
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
// 发送MODBUS TCP请求(注意,格式与MODBUS串行不同)
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")
}
希望对你有帮助!
英文:
I'm trying to test out performing a simple TCP MODBUS read of a single register from a device emulator. When running the code it is showing a response of 0 bytes and I get the message "connection reset by peer". Any ideas as to why it's not working?
UPDATE, my request was incorrect, the correct working MODBUS TCP poll code is:
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")
}
答案1
得分: 0
最初我认为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("写入错误:", err)
return
}
fmt.Printf("已写入 %d 字节的请求:%#v", n, req)
rsp := make([]byte, 64)
n, err = conn.Read(rsp)
fmt.Printf("接收到 %d 字节的响应:%#v", n, rsp[:n])
if err != nil {
fmt.Println("读取错误:", err)
}
英文:
Originally I thought that fmt.Fprintf
may be changing the request data on the way out, but this example seems to work OK.
However, I would still recommend using the lower-level Write/Read
instead of 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)
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论