[Problem] Kommunikation mit ctlmgr

Thalhammer

Neuer User
Mitglied seit
8 Nov 2010
Beiträge
32
Punkte für Reaktionen
0
Punkte
0
Hallo, da ich es in eine Eigene anwendung integrieren muss und ctlmgr_ctl auf meinem System(W501V) nicht vorhanden ist habe ich versucht das ganze selbst zu schreiben, schlieslich ist das Protokoll im Wiki recht gut beschrieben und mittels eines straces von webcm auch recht leicht nachzubauen.
Problem, anders als beim original webcm empfängt meine Anwendung nichts und bleibt beim recvfrom call hängen.
Der Aufbau folgt genau dem von webcm und auch die ausgabe von strace stimmt bis zum recvfrom überein.
Jemand ne idee, warum webcm etwas zurück kriegt und ich nicht ?

MFG Thalhammer
Programm:
Code:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <string.h>
#include <string>

int main(int argc, char *argv[])
{
    printf("My PID:%d\n",getpid());
    char * server_filename = "/var/tmp/me_logic.ctl";
    char client_filename[256];
    sprintf(client_filename,"/var/tmp/me_ctlmgr_ctl%d.ctl",getpid());

    struct sockaddr_un server_addr;
    struct sockaddr_un client_addr;
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sun_family = AF_UNIX;
    strncpy(server_addr.sun_path, server_filename, 104); // XXX: should be limited to about 104 characters, system dependent

    memset(&client_addr, 0, sizeof(client_addr));
    client_addr.sun_family = AF_UNIX;
    strncpy(client_addr.sun_path, client_filename, 104);
    int sockfd;
    if((sockfd = socket(AF_UNIX,SOCK_DGRAM,0))<0) perror("socket2 failed");
// bind client to client_filename
    if(bind(sockfd, (struct sockaddr *) &client_addr, sizeof(client_addr))!=0){
        perror("bind failed");
    }
    char message[1024];
    int message_length=sprintf(message,"<message><to>box</to><from>ctlmgr_ctl%d</from><sequence>2</sequence><transaction><type>query</type><key>settings/upnp/activated</key><error>0</error></transaction></message>",getpid());
    printf("Sending:%s\nLength:%i\n",message,message_length);
    int bytes = sendto(sockfd,message,message_length,0,(struct sockaddr *) &server_addr,sizeof(struct sockaddr_un));
    printf("Bytes_sent:%i\n",bytes);
    char buffer[1024];
    int len = sizeof(struct sockaddr_un);
    bytes=recvfrom(sockfd,&buffer,1023,0,(struct sockaddr *) &server_addr,(socklen_t *) &len);
    printf("Bytes_read:%i",bytes);
    printf("%s",buffer);
    // clean up
    close(sockfd);
    unlink(client_filename);
    return 0;
}
 
Dass ist aber komisch, denn ich habe dass Programm anhand einer Vorlage des webcm meiner Box entwickelt und der bekommt auch eine Antwort.
Gut aber zumindest bin ich jetzt sicher dass ich keinen Groben Fehler gemacht habe.
Ich werde heute aben mal versuchen anstatt des Requests aus dem Wiki einen aus dem webcm meiner Box zu nutzen.
//EDIT: Tatsächlich, auf meiner 7270 funktionierd es auf anhieb, warum aber nicht auf dem 501 ?
 
Zuletzt bearbeitet:
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.