UDP C++ получить
Я хочу отправлять / получать данные с устройства через 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 Adress 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, но не могу найти свою ошибку. Кто-нибудь может мне помочь?
С уважением Тобиас
1 ответ
Код Python связывается со всеми существующими локальными интерфейсами в порту 5004, тогда как код C будет неявно связываться с локальным свободным портом во время вызова connect(), таким образом, если удаленный узел жестко закодирован для ответа на порт 5004, сокет не получит его.
Вы должны добавить вызов в bind() сразу после создания сокета:
bind(sock, (sockaddr *)&ADDRESS, sizeof(ADDRESS));
И посмотрим, что получится:)