Ich möchte Daten von einem Gerät über UDP senden/empfangen. Das Gerät fungiert als Server und wenn ich ihm einen Wert zusende, schickt er mir einige Werte zurück. Zuerst schreibe ich ein wenig Python-Code weichen Werke ohne prolems:UDP C++ empfange
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])
ich einen Wert in ein Register mit diesem Skript schreiben und einen Array mit allen aktualisierten Registerwerten aus dem Gerät zurück. Ich schreibe ein gleiches Programm in 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);
}
}
ich gesendeten Werten der Lage bin, und das Gerät sendet seine Registerwert zurück, so dass die Kommunikation funktioniert (Ich habe dies mit wireshark). Aber ich kann die Daten in meinem Programm nicht empfangen. Ich empfehle die Recv-Funktion, weil das Programm an diesem Punkt hängenbleibt, wenn ich empfangen möchte. Die Funktion recvfrom() funktioniert auch an dieser Stelle nicht. Ich habe versucht, die bind() - Funktion anstelle von connect, weil im Python-Skript mit sock.bind funktioniert. Aber als ich nicht senden oder empfangen kann. Ich habe mehrere Posts über die UDP-Empfangsfunktion gelesen, kann aber meinen Fehler nicht finden. Kann mir jemand helfen?
Grüße Tobias
Einige Fehler Gabe in Ihrer Situation nützlich gewesen wäre – rustyx
Wer sendet Antwort zurück zu Ihrem C-Code? Erwarten Sie, dass Sie das Paket erhalten, das Sie mit Ihrem C-Code gesendet haben? –
@Daniel Laut dem OP ist es ein Gerät, das unter der IP-Adresse 192.168.42.33 lebt (der Kommentar sagt "Scanner-Einheit"). Und nein, er erwartet nicht, das Paket, das er gesendet hat, zu erhalten, er erwartet eine Antwort von dem Gerät zu erhalten. –