我有一个设备在端口IN_PORT上侦听UDP数据包并在端口OUT_PORT上回显消息 . 我可以使用Packet Sender等测试软件与之通信 .
我必须编写一个C库(目前是Win32)来与设备通信 . 我做了几次测试,但我还是无法沟通 . 我的猜测是使用这个工作流程:
-
创建套接字
-
使用设备地址,AF_INET系列和侦听端口(OUT_PORT)填充sockaddr_in结构
-
绑定套接字
-
用IN_PORT更改sockaddr_in.sin_port并发送数据包(使用sendto)
-
等待答案(使用recvfrom)
-
从4开始重复
如果我使用Packet Sender实用程序在本地工作(设备地址= 127.0.0.1)来模拟设备,则此方法有效 . 我无法使用相同的工作流连接到远程地址,即使在同一子网中(例如我的PC地址:192.168.1.2,远程PC地址192.168.1.5),因为我收到WSAEADDRNOTAVAIL错误 .
我已经测试了几个不同的工作流程,并在这里和那里阅读了关于这个主题的几个讨论,但没有一个工作,非常好 .
有人可以给我一些关于这个问题的提示 .
谢谢!
混合
2 回答
你的工作流程有点不对劲 . 它应该更像是这样:
创建套接字
使用 the address of the local network adapter that is communicating with the device ,AF_INET系列和listenig端口(OUT_PORT)填充sockaddr_in结构
绑定套接字
更改 sockaddr.sin_addr with device address ,并使用IN_PORT更改sockaddr_in.sin_port,并发送数据包(使用sendto)
等待答案(使用recvfrom)
从4开始重复
我按照 Remy Lebeau 提示改变了我的代码 . 它现在有效 . 如果有人想看看并发现一些弱点,或建议改进,我会很高兴(一个代码"just works"永远不够;它也必须"shine"!) . 注释标记代码的上一个(错误)版本 .