- 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:
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;
}