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
lenn123.05.1119: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;
}
0

Kommentare

lenn1
lenn123.05.1119: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;
}

0
ditobbi23.05.1120:08
dir fehlt ein endl nach dem Aufruf von AnruferNummer(...). um den Puffer zu leeren.
0
lenn1
lenn123.05.1120: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!
0
Navier-Stokes
Navier-Stokes24.05.1117: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)“
0

Kommentieren

Diese Diskussion ist bereits mehr als 3 Monate alt und kann daher nicht mehr kommentiert werden.