Ich versuche, ein UDP-Datagramm von einem Linux-Computer an eine IP-Kamera zu senden, um es zu erkennen. Alle Geräte sind über einen Switch verbunden.UDP kann nicht von einem Linux-Computer an eine Multicast-Gruppe gesendet werden
Es gibt eine mit dieser Kamera kompatible Windows-App, die ein UDP-Datagramm an eine Multicast-Gruppe sendet und eine Antwort von der Kamera über dieselbe Gruppe erhält. Ich habe das über Wireshark herausgefunden und beschlossen, das gleiche Datagramm aus einem C-Programm auf meinem Linux-Rechner zu senden. Ich kann die richtige Antwort erhalten, wenn mein C-Programm es direkt an die IP-Adresse der Kamera sendet, aber nicht, wenn ich es an die Multicast-Gruppe sende.
Ich habe daher ein Listener-Programm auf meinem Linux-Computer erstellt und versucht, es an die Multicast-Adresse zu senden. Das ist gelungen, aber in Wireshark habe ich nichts gefunden.
So scheint es, dass mein C-Programm in der Lage ist, das Datagramm korrekt zu senden, nur nicht auf das Netzwerk. Kann dies eine Art von Linux-Konfiguration sein?
EDIT: Wie angefordert, hier ist der Code. Zu Ihrer Information: Ich versuche nur, Daten an die Kamera zu senden und die Reaktion in Wireshark zu untersuchen.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <errno.h>
#include "udp_socket.h"
int main(void)
{
//int s = udp_socket(50000);
int s = socket(AF_INET,SOCK_DGRAM,0);
printf("Socket: %d\r\n", s);
char buffer[48] = {0x67,0x45,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x67,0x45,0x00,0x00,0x14,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0xea,0xc8,0xc8,0xc8,0xf4,0xe6,0x00,0x00};
struct sockaddr_in serveraddr;
memset(&serveraddr, 0, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(59125);
serveraddr.sin_addr.s_addr = inet_addr("234.200.200.200");
udp_socket_tx(s, buffer, sizeof(buffer), &serveraddr);
close(s);
}
udp_socket_tx() von udp_socket.h:
int udp_socket_tx(int socket_fd, char * tx_buffer, int tx_buffer_len, const struct sockaddr_in * to_addr) {
return sendto(
socket_fd,
tx_buffer,
tx_buffer_len,
0,
(const struct sockaddr *)to_addr,
sizeof(struct sockaddr_in)
);
}
Das ist natürlich sehr schwer ohne Ihren Code, aber haben Sie die Multicast-Gruppe zuerst in Ihrem Linux-Programm * beitreten? – unwind
Multicast muss auf der Netzwerkschnittstelle erlaubt sein. Probieren Sie den Befehl 'ifconfig eth0 multicast' (ersetzen Sie eth0 durch Ihre Adapter-ID). – Marian
Können Sie Ihren Code anhängen? –