Bereiche
News
Rewind
Tipps & Berichte
Forum
Galerie
Journals
Events
Umfragen
Themenwoche
Kleinanzeigen
Interaktiv
Anmelden
Registrierung
Zu allen empfangenen Nachrichten
Suche...
Zur erweiterten Suche
Push-Nachrichten von MacTechNews.de
Würden Sie gerne aktuelle Nachrichten aus der Apple-Welt direkt über Push-Nachrichten erhalten?
Forum
>
Entwickler
>
C/C++ Profi gefragt
C/C++ Profi gefragt
lenn1
23.05.11
19:11
Ich versuche gerade ein Skript zu schreiben, dass den Stream des Anrufmonitors meiner Fritzbox ausliest und dann verarbeitet.
Die Funktion ist grundsätzlich gegeben.
Leider funktioniert das Verarbeiten des Strings nicht, den ich von der FB empfange.
Das empfange ich:
23.05.11 18:44:30;RING;0;0151XXX3223;046XXXX974;SIP0;
Davon schneide ich die ersten 25 Zeichen ab und suche anschliessend das ';' um alles ab der Position abzuschneiden.
In einem Testprogramm geht das auch. Nur leider in der While-Schleife da unten nicht.
Ich habe wie man sieht einfach mal die Funktion die mir den String formatieren soll
VOR
allem anderen aufgerufen und siehe da: Es klappt nichtmal so!
Jetzt das kuriose!:
Wenn ich aber die Schleife da unten auskommentiere klappt es tadellos.
Habe alle Compiler unter OSX durch, die im Xcode 4 mit drin sind. Und unter Linux ist das gleiche Phänomen festzustellen.
#include <iostream.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netinet/in.h>
using namespace std;
string AnruferNummer(string anrufString)
{
string temp(anrufString);
temp = temp.substr(25);
ssize_t pos = temp.find(';');
temp = temp.substr(0,pos);
return temp;
}
int main ()
{
try
{
cout << endl << "nr: " <<AnruferNummer("23.05.11 18:44:30;RING;0;0151XXX3223;046XXXX974;SIP0;");
///////// Connecting.. /////////
sockaddr_in remote_addr;
remote_addr.sin_family = AF_INET;
remote_addr.sin_port = htons(1012);
remote_addr.sin_addr.s_addr = inet_addr("192.168.178.1");
int sfd = socket(AF_INET, SOCK_STREAM, 0);
if(sfd == -1)
throw "socket";
int con = connect(sfd, (struct sockaddr*)&remote_addr, sizeof(remote_addr));
if(con == -1)
throw "connect";
/////////////////////////////////
char buffer[100];
ssize_t len = 100;
while(true)
{
ssize_t rec = recv(sfd, buffer, len, sizeof(remote_addr));
if(rec == -1)
throw "receive";
if(strstr(buffer,"RING") != NULL)
{
cout << "Anruf!" << endl;
cout << endl << "nr: " <<AnruferNummer(buffer);
}
}
}
catch (char*fehler)
{
cout << fehler << "-error\n";
}
return 0;
}
Hilfreich?
0
Kommentare
lenn1
23.05.11
19:17
Noch mehr kurioses!
Wenn ich es laufen lasse und mich anrufe dann kommt folgende Ausgabe:
Anruf!
Wenn ich mich dann nochmal anrufe sieht es plötzlich so aus:
Anruf!
nr: 0151XXX3223Anruf!
(Also ohne Testweise cout am anfang..)
#include <iostream.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netinet/in.h>
using namespace std;
string AnruferNummer(string anrufString)
{
string temp(anrufString);
temp = temp.substr(25);
ssize_t pos = temp.find(';');
temp = temp.substr(0,pos);
return temp;
}
int main ()
{
try
{
///////// Connecting.. /////////
sockaddr_in remote_addr;
remote_addr.sin_family = AF_INET;
remote_addr.sin_port = htons(1012);
remote_addr.sin_addr.s_addr = inet_addr("192.168.178.1");
int sfd = socket(AF_INET, SOCK_STREAM, 0);
if(sfd == -1)
throw "socket";
int con = connect(sfd, (struct sockaddr*)&remote_addr, sizeof(remote_addr));
if(con == -1)
throw "connect";
/////////////////////////////////
char buffer[100];
ssize_t len = 100;
string anrufer;
while(true)
{
ssize_t rec = recv(sfd, buffer, len, sizeof(remote_addr));
if(rec == -1)
throw "receive";
if(strstr(buffer,"RING") != NULL)
{
cout << "Anruf!" << endl;
cout << endl << "nr: " <<AnruferNummer(buffer);
}
}
}
catch (char*fehler)
{
cout << fehler << "-error\n";
}
return 0;
}
Hilfreich?
0
ditobbi
23.05.11
20:08
dir fehlt ein endl nach dem Aufruf von AnruferNummer(...). um den Puffer zu leeren.
Hilfreich?
0
lenn1
23.05.11
20:32
ditobbi
dir fehlt ein endl nach dem Aufruf von AnruferNummer(...). um den Puffer zu leeren.
Unfassbar. Es geht. Darauf wäre ich nie gekommen.
Vielen Dank!
Hilfreich?
0
Navier-Stokes
24.05.11
17:57
Du solltest die Parameter in
string AnruferNummer(string anrufString)
per Pointer oder einfacher per Referenz übergeben, damit nicht alles über den Stack kopiert werden muss. Ist zwar nicht wild aber im Prinzip effizienterer Stil.
Also
string& AnruferNummer(string& anrufString)
„Computer Science is no more about computers than astronomy is about telescopes. (Edsger W. Dijkstra)“
Hilfreich?
0
Kommentieren
Diese Diskussion ist bereits mehr als 3 Monate alt und kann daher nicht mehr kommentiert werden.
Interview: Größte private Mac-Sammlung
iPad Pro M4: Hinweise auf geringere Nachfrage
M4 Max: Noch beeindruckendere Benchmark-Ergebni...
iPhone SE 4 von allen Seiten – Dummy aufgetauch...
Update-Abend: macOS 15.1.1, iOS 18.1.1, iPadOS ...
Bericht: MacBook Air M4 auf dem Weg – und mehr ...
Kurz: Apple bietet iPhone 15 erstmals refurbish...
Apple gewährt Einblick in Audio- und Video-Test...