【发布时间】:2018-03-01 06:30:00
【问题描述】:
我想通过 UDP 从设备发送/接收数据。该设备充当服务器,如果我向它发送一个值,它会向我发送一些值。首先我写了一个没有任何问题的python代码:
import socket
import time
UDP_IP = "192.168.42.33"
UDP_PORT = 5004
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(('',UDP_PORT))
while True:
MESSAGE = input('Write new message: ')
sock.sendto(bytes.fromhex(MESSAGE), (UDP_IP, UDP_PORT))
time.sleep(0.1)
data, addr = sock.recvfrom(1076)
a = len(data)
print ("Byte: ", data.hex()[46], data.hex()[47])
我可以使用此脚本将值写入寄存器,并从设备返回包含所有更新的寄存器值的数组。我用c++写了一个相等的程序:
#pragma once
#pragma comment(lib, "Ws2_32.lib")
#include <sdkddkver.h>
#include <WinSock2.h>
#include <Windows.h>
#include <iostream>
#include <string>
#define SCK_VERSION2 0x0202
#define BUFLEN 2048
using namespace std;
int main()
{
int inputI;
long SUCCESSFUL;
WSAData WinSockData;
WORD DLLVersion;
SOCKET sock;
char msg_input[] = { 0x60, 0x01, 0x00, 0x00}; //Write REG mode, 1 byte
char* SU_IP = "192.168.42.33"; //IP Address of Scanner Unit
u_short SU_PORT = 5004; //Port of Scanner Unit
SOCKADDR_IN ADDRESS;
char buf[BUFLEN];
int slen = sizeof(ADDRESS);
DLLVersion = MAKEWORD(2, 1);
SUCCESSFUL = WSAStartup(DLLVersion, &WinSockData);
sock = socket(AF_INET, SOCK_DGRAM, 0);
ADDRESS.sin_addr.s_addr = inet_addr(SU_IP);
ADDRESS.sin_family = AF_INET;
ADDRESS.sin_port = htons(SU_PORT);
connect(sock, (SOCKADDR*)&ADDRESS, sizeof(ADDRESS));
while (1)
{
cout << "Adresse des Registers (hex): ";
cin >> hex >> inputI;
msg_input[2] = inputI;
cout << "Wert des Registers (hex): ";
cin >> hex >> inputI;
msg_input[3] = inputI;
send(sock, msg_input, sizeof(msg_input), NULL);
//recv(sock, buf, BUFLEN, 0);
}
}
我能够发送值并且设备将其寄存器值发回以便通信正常进行(我使用wireshark检查了这一点)。但我无法在我的程序中接收数据。我注释了 recv 函数,因为如果我想接收,程序会卡在这一点上。 recvfrom() 函数此时也不起作用。我尝试了 bind() 函数而不是 connect,因为在 python 脚本中它与 sock.bind 一起使用。但比我不能发送或接收。我正在阅读几篇关于 UDP 接收功能的帖子,但找不到我的错误。有人可以帮我吗?
【问题讨论】:
-
一些错误处理在您的情况下会很有用
-
谁将响应发送回您的 C 代码?您是否希望收到您使用 C 代码发送的数据包?
-
@Daniel 根据 OP,它是一个位于 IP 地址 192.168.42.33 的设备(评论说“扫描仪单元”)。不,他不希望收到他发送的数据包,他希望收到来自设备的响应。
-
send(以及socket和connect)的返回值是多少?