== Suche hilfe bei DB-Telefon Projekt ==



  • hallo erstmal an alle hier im forum

    bin kein c++ neuling hab aber auch keine rutine drin
    brauche lermeister für folgendes projekt:

    ich stecke grade mitten in einem praktikum und soll hier der datenbank anwendung Filemaker das telefonieren bei bringen
    kein voip sondern analog
    das funz folgender maßen
    ein siemensmann hat die telefonanlage mit einner netzwerkkarte ausgestattet so das die telefonanlage jetzt mit dem firmen netz verbunden ist

    auf einem server läuft ein serverprogramm TeamCall Serverder auf der telefonanlage auf einem CSTA port lauscht
    diese CSTA pakete übersetzt er und sendet sie an eine client-SW weiter
    so das der client ein fenster auspucken kann "he hier ruft die nummer 0045-blalblafuu an"

    und genau hier setzt mein job ein

    ich möchte die pakete die der TeamCall Server an den client sendet abfangen
    (wie die ausehen weis ich hab nen TCPdump gemacht)
    die anrufende telefonummer rausschneiden
    per ODBC an den Filemaker server schicken und name,firma,... der anrufenden person wieder ausgespukt bekommen

    all dies geschieht auf apple machintosh rechnern also BSD unterbau

    ich hab da schon ne kleine klasse gebaut

    class CListening
    {
    	private:
    		String str = ""
    
    		//listen o teamcall variablen
    		String	anrufer_nr		= "";
    		String	angerufener_nr	= "";
    		String	clientIP		= "";//soll später aus der DB gezogen werden
    
            //hier kommen noch ganz parr SQL strings  für den ODBC quatsch
    		.
    		.
    		const SQLCHAR *	SQLQuery_anruf_Ausland = "SELECT DISTINCT PERS_ID FROM PERSONEN WHERE PK_ivw_string = "+str+"";
    		.
    		.
    		//die anrufer daten die aus der DB gesaugt werden sollen hier reingesteckt werden
    		String PERS_anrede	    = "";// hier steht zb. 'Frau Louise Kokoschinski'
    		String ADR_firma_zeile_1= "";// hier steht zb. 'Gräfenberg AG Entenhausen'
    
    	public:
    		~CListening(){}
    
    		String	Lf_listen_to_teamcall();//in den 3 funktionen 		String	Lf_evaluate_resulte(String);//habe ich schon was 
    		void	Lf_connect_filemaker(String);//zusammengeschrieben
    		void	Lf_build_packed(){}
    		void	Lf_send_packet_to_client(){}
    
    };
    

    und auch sonst alles soweit vorbereitet jetz brauch ich nur noch hilfe beim proggen
    hab dem stroustrup sein buch neben mir liegen aber das hilf mir nicht immer weiter sockets zb sind da ja garnich beschrieben

    ich brauch jetz zb hilfe wie ich genau auf nem port lausche die pakete abfange und dem Teamcall Server vorgaukel das sie beim client angekommen weren den HEXcode dafür habe ich also das was der client sendet

    oder einfachste string-bastel-funktionen bestimmten teil rauschneiden
    ich hab im stroustrup blos die find() funktionen gefunden

    hat jemand bock mir dabei zu helfen
    würde mich freuen

    wenn das ganze am ende funzt hat mir mein cheff erlaubt bei sourceforge ein projekt einzurichten da schieb ich dann den quellcode und mein UML krizelein hoch



  • jetz hats mir im code ne funktion nich auf die nächste zeile gebrochen 😑

    wollte noch zum sourceforge was schreiben
    also ich würde kommplett von dokumen tation bis hin zu telefon-vorwahllisten (die ich auch von sourceforge hab) alles hochauen

    so das sich jede firma die sone teure telefonanlage hat das zeuch selber zusammen bauen kann

    ich habe auserdem noch nich erklärt das es umgekährt ja genauso funktioniert mit em anrufen
    man gibt der client applikation nur einnen telefonummer string und die sagt dann dem teamcall server das er die nummer mal anrufen soll

    praxis:
    ich klicke einen knopf in der datenbank der ein script auslöst was der client applikation die nummer übergibt und ...
    oder makiere eine nummer irgendwo und löse über ein kontextmenübefehl den selben trara aus

    danach stellt der teamcall server die verbindung her und wenn das geschehen ist klingelt mein telefon und ich kann mit dem jenigen telefonieren

    soweit zur anderen seite

    die client applikation die das übernimmt will ich später noch durch eine eigene erstetzen



  • Hallo,
    was *genau* ist das Problem?



  • ich weis nich wie man den socket programmiert der auf dem port lauschen soll
    geschweige den wie ich die pakte dann abfange und dem server wiederum zum vorgaukeln das alles ok ist pakte schicke

    bin schonmal so weit

    String CListening::Lf_listen_to_teamcall();
    {
    	int Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
        if(Socket == -1) 
        { 
            cout << "Socket konnte nicht erstellt werden!" << endl; 
            return 1; 
        }
    
    	sockaddr_in service; // erstellt mir eine IPv4 Strucktur
        service.sin_family = AF_INET; // AF_INET für IPv4 - hier gebe ich an das ich ipv4 haben will für ipv6 were es AF_INET6
    
    	//ich speichere den port 26535 den das "direct" für den kontakt zum "teamcall server" nutzt
    	//die strucktur speichert den port in umgekehrter reinfolge deswegen muss ich die zahalen mit htons() umdrehen
    	service.sin_port = htons(26535);
    
    	string ip = "192.168.1.6";
    	//inet_addr() wandelt den string in die richtige byte reinfolge um ohne PUNKT 
    	service.sin_addr.s_addr = inet_addr(ip.c_str());	
    
    	//ich verbinde den socket mit dem port dazu überebe ich der function connet() zuerst den Socket die adresse von service die ich vorher noch casten muss und die größe von service
    	int result = connect(Socket, reinterpret_cast<sockaddr*>(&service), sizeof(service));
    
    	if(result == -1) 
        { 
            cout << "Verbindung fehlgeschlagen!" << endl; 
            return 1; 
        } 
    
        cout << "Verbindung erfolgreich!" << endl;
    
    	close(Socket); 
    }
    


  • und das kann dannn in en abgefangenen paketen im Data bereich drin stehen

    so sieht der hex dump von 2 paketen aus die der server verschickt

    ==  Functionen  ConnectionCleared===
    
    43 6f 6e 6e 65 63  74 69 6f 6e 43 6c 65 61 72 65 64    "ConnectionCleared"
    
    20 "blank"
    33 39  "telefonummer die angerufen wird -  39"
    20 "blank"
    
    6e  6f 72 6d 61 6c 43 6c 65 61 72 69 6e 67  "normalClearing"
    20 "blank"
    
    30 31  37 38 38 34 35 31 31 34 34     "handy nummer die anruft - 01788451144"
    
    20 "blank"
    7b 7d   " '{}' - das ende"
    
    ===  Functionen  Delivered ===
    
    44 65 6c 69 76 65  72 65 64 "Delivered"
    
    20 "blank"
    33 39    "telefonummer die angerufen wird -  39"
    20 "blank"
    
    6e 65 77 43 61 6c 6c "newCall "
    
    20 "blank"
    33 39    "telefonummer die angerufen wird -  39"
    20 "blank"
    
    30 31  37 38 38 34 35 31 31 34 34     "handy nummer die anruft - 01788451144"
    
    20 "blank"
    33 39    "telefonummer die angerufen wird -  39"
    20 "blank"
    
    22 22   '  ""  ' <- das ende
    

    hier raus will ich mir jetz die telefonummer saugen die anruft

    und später muss ich so ein paket wieder zusammen basteln

    wie mach ich das am besten

    were jetz voll angetan wenn mir leute sagen könnte "ja klar das machste mit der funktion und das geht soundso" das würde mir aufwendiges gegoogel ersparen ^^



  • Such dir am besten mal aus dem Netz ein Socket-Tutorial.

    Die Funktionen zum Senden und Lesen heißen 'send' bzw. 'recv'...



  • hmm hab schon

    http://www.pc-adviser.de/socket_programmierung.html

    trozdem danke

    bin jetz soweit das ich den port belauche das was gesendet wird abfange in ein buffer schreibe
    den buffer in hexcode umwandele

    und jetz

    if(hexcode.find("436f6e6e656374696f6e436c6561726564"))//heißt ConnectionCleared
    else if(hexcode.find("44656c697665726564")//heißt Delivered
    

    den index des letzten zeichens zurück haben will wenn er den string den ich suche findet

    gibts dafür ne funktion? oder muss ich selber alles mit der schreife durch crawlen?



  • Ich würde das ganze etwas... strukturierter... angehen.

    Z.B. empfängst du ja mit deiner Socket-Klasse die Daten. Die Nachricht lässt du dir als String geben und suchst den Teil bis zum ersten Leerzeichen raus.
    Dann vergleichst du, wenn dieser Teil gleich "ConnectionCleared" ist, dann hast du eine Nachricht usw.
    Edit: Das machst du zwar so ähnlich, aber mit dem Hex-String ist es nicht besonders schön... /Edit

    Für "ConnectionCleared" rufst du dann eine Funktion auf, die den String behandelt; sucht z.B. die Telefonnummer, die angerufen wird und den Anrufer raus und gibt dieses in einer Struct zurück, dann kannst du weiter damit verfahren. Da ja anscheinend alles als ASCII-Text übermittelt wird, ist es doch relativ schwachsinnig, den String in einen Hex-String umzuwandeln...



  • mit der funktion das hatte ich auch so vor

    aber ma zu dem resv()
    ich hab eben gestern gelesen das resv() alles als bytestream zurück giebt

    wandelt der =operator das automatsich in ASCII um wenn ich das in ein String objekt stecke anstadt ein einfaches char[1024]
    wird da n unterscheid gemacht?

    wie wandele ich jetz den bytecode in ASCII um damit ich den normalen string bearbeiten kann
    were natürlich viel geiler



  • Strings bestehen doch quasi aus "Byte-Code". Jedem Buchstabe aus dem ASCII-Alphabet ist eine Zahl zugeordnet, z.B. dem 'A' die 65 bzw 0x41. Ein char[1024] kannst du als Byte-Folge oder als String interpretieren, je nachdem was dadrin steckt. In deinem Fall steckt ein String drin, also ist es einer...
    Irgendwie sieht dein Code auch nicht soooo sehr nach C++ aus.. Oder seit wann kann man eine Membervariable schon in der Deklaration initialisieren 😕

    e: je nachdem, wie die String-Klasse aufgebaut ist, müsste sie eigentlich den Zuweisungsoperator "=" auf char[] unterstützen.



  • ging das nicht der member variable schon ne wert zuteilen? mir wars so

    mit welchen funktionen kann ich mir jetz den index der erstn oder des letzen zeichens des gefunden strings zurückgeben lassen
    werde doch den index brauchen damit ich ab da anfangen kann die telefonummer rauszuscheiden

    gibts doch sicherlich ne funktion



  • hallo ich brauch mal wieder hilfe

    hat jemand erfahrung mit cpp ODBC?
    ich will ja an den filmaker anbendeln

    blos hab irgend n schreiß problem

    0xa0001c4c Failed to connect
    
    The driver reported the following diagnostics whilst running SQLDriverConnect
    

    mit dem SQLDriverConnect()
    http://msdn2.microsoft.com/en-us/library/ms715433.aspx

    schätze mal es liegt am Connection string
    habe mir den richtigen für den filemaker hier rausgesucht
    http://www.connectionstrings.com/default.aspx?carrier=filemaker

    funzt aber trozdem nicht
    treiber ist installiert - check

    habe ich mir mit diesem code anzeigen lassen

    #include <stdio.h>
    #include <sql.h>
    #include <sqlext.h>
    
    main() {
      SQLHENV env;
      char dsn[256];
      char desc[256];
      SQLSMALLINT dsn_ret;
      SQLSMALLINT desc_ret;
      SQLUSMALLINT direction;
      SQLRETURN ret;
    
      SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
      SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void *) SQL_OV_ODBC3, 0);
    
      direction = SQL_FETCH_FIRST;
      while(SQL_SUCCEEDED(ret = SQLDataSources(env, direction,
    					einsetze   dsn, sizeof(dsn), &dsn_ret,
    					   desc, sizeof(desc), &desc_ret))) {
        direction = SQL_FETCH_NEXT;
        printf("%s - %s\n", dsn, desc);
        if (ret == SQL_SUCCESS_WITH_INFO) printf("\tdata truncation\n");
      }
    }
    
    odbcfms - FileMakerODBCsystem
    odbcfmu - FileMakerODBCuser
    
    test has exited with status 0.
    

    egal welchen von beinden treibernnamen ich nun einsetze es funzt nicht

    hier mein SQLDriverConnect()

    SQLDriverConnect(dbc, NULL,
    (SQLCHAR*)"AllAsText=0;ApplicationUsingThreads=1;FetchChunkSize=100;Driver=odbcfms;FileOpenCache=0;IntlSort=0;MaxTextlength=255;ServerAddress=127.0.0.1;TranslationOption=0;UseRemoteConnection=1;",
    sizeof("AllAsText=0;ApplicationUsingThreads=1;FetchChunkSize=100;Driver=odbcfms;FileOpenCache=0;IntlSort=0;MaxTextlength=255;ServerAddress=127.0.0.1;TranslationOption=0;UseRemoteConnection=1;"),
    outstr, 255, &outstrlen,SQL_DRIVER_NOPROMPT);
    

    kann mir jemand helfen?



  • oh, grausam!

    sizeof liefert dir so NICHT die Länge des Strings zurück.

    Mach es besser so:

    SQLCHAR *pStr = "AllAsText=0;ApplicationUsingThreads=1;FetchChunkSize=100;Driver=odbcfms;FileOpenCache=0;IntlSort=0;MaxTextlength=255;ServerAddress=127.0.0.1;TranslationOption=0;UseRemoteConnection=1;";
    
    SQLDriverConnect(dbc, NULL, pStr, strlen(pStr), outstr, 255, &outstrlen,SQL_DRIVER_NOPROMPT);
    

    Edit: Tippfehler beseitigt



  • thx

    aber hat nix genützt bringt immer noch den selben fehler

    so siehts jetzt aus

    char *pStr = "AllAsText=0;ApplicationUsingThreads=1;FetchChunkSize=100;Driver=odbcfms;FileOpenCache=0;IntlSort=0;MaxTextlength=255;ServerAddress=127.0.0.1;TranslationOption=0;UseRemoteConnection=1;"; 
    
    SQLDriverConnect(dbc, NULL,(SQLCHAR*) pStr, strlen(pStr),outstr, sizeof(outstr), &outstrlen,SQL_DRIVER_COMPLETE);
    


  • nino2 schrieb:

    thx

    aber hat nix genützt bringt immer noch den selben fehler

    so siehts jetzt aus

    char *pStr = "AllAsText=0;ApplicationUsingThreads=1;FetchChunkSize=100;Driver=odbcfms;FileOpenCache=0;IntlSort=0;MaxTextlength=255;ServerAddress=127.0.0.1;TranslationOption=0;UseRemoteConnection=1;"; 
    
    SQLDriverConnect(dbc, NULL,(SQLCHAR*) pStr, strlen(pStr),outstr, sizeof(outstr), &outstrlen,SQL_DRIVER_COMPLETE);
    

    Wäre hier nicht std::string zusammen mit str.c_str() & str.size() mehr zu empfehlen?



  • ^^

    so funktioniert es jetzt wunderbar

    char *pStr = 
    	"AllAsText				= 0;"
    	"ApplicationUsingThreads= 1;"
    	"FetchChunkSize			= 100;"
    	"DRIVER					= odbcfms;"			//	<-- der treiber name den ich im "ODBC Administrator.app" angelegt habe
    	"UID					= user"		//	<-- der nutzername der im filemaker angelegt wurde
    	"PWD					= pw"			//	<-- pw des nuzers
    	"FileOpenCache			= 0;"
    	"IntlSort				= 0;"
    	"MaxTextlength			= 255;"
    	"ServerAddress			= 127.0.0.1;"		// <- server adresse natürlich local   
    	"TranslationOption		= 0;"
    	"UseRemoteConnection	= 1;"; 
    
    	SQLDriverConnect(dbc, NULL,(SQLCHAR*) pStr, strlen(pStr),outstr, sizeof(outstr), &outstrlen,SQL_DRIVER_COMPLETE);
    
    cout<<"\n\nConnect to Filemaker ODBC Driver .... ";
    
    	if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO) 
    	{		
    		cout<<"OK\n\nReturned connection string was:\n\t"<<outstr<<"\n\n\n";
    		if (ret == SQL_SUCCESS_WITH_INFO) 
    		{
    			cout<<"Driver reported the following diagnostics\n"<<endl;
    			extract_error("SQLDriverConnect", dbc, SQL_HANDLE_DBC);
    		}
    	} 
    	else 
    	{
    		cout<<stderr<<" Failed to connect\n"<<endl;
    		extract_error("SQLDriverConnect", dbc, SQL_HANDLE_DBC);
    	}
    
    Connect to Filemaker ODBC Driver .... OK
    
    Returned connection string was:
    	\367\210\277\377\367\210
    

    jetz hängt er sich aber an der nächsten stelle auf

    return = SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);
    

    mag er nich machen

    bringt mir der debuger

    SQLAllocStmt_Internal  -> 0x9893d130  <+0056>  lwz     r0,36(r3)
    SQLAlloHandle_Internal -> 0x9894529c  <+0180>  b       0x989453f4 <SQLAllocHandle_Internal+524>
    SQLAlloHandle          -> 0x989454dc  <+0212>  lwz     r0,0(r26)
    
    und main.cpp eben      -> ret = SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);
    

    weis jemand rat?



  • was soll return = SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt); für ne syntax sein? meinst du vielleicht return SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);?



  • nein
    return is ein objekt vom typ SQLRETURN ich speichere da den rückgabewert rein

    habs schon umgenant in ret

    SQLRETURN ret;

    ^^



  • Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ in das Forum Projekte verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Dieser Thread wurde von Moderator/in Korbinian aus dem Forum Projekte in das Forum Datenbanken verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • ach scheiß der SQLDriverConnect() hat deshalb gefunzt weil ich oben zeile 16

    SQLDriverConnect(dbc, NULL,(SQLCHAR*) pStr, strlen(pStr),outstr, sizeof(outstr), &outstrlen,SQL_DRIVER_COMPLETE);
    

    das "ret = " vergessen habe
    so rutscht er natürich durch die fehler behandlung den in ret ist ja noch SQL_SUCCESS vom letzten allochandlering 😑

    weil ichs hier ausm forum kopiert habe

    also kommando zurück SQLDriverConnect() funt immer noch nich leig immer noch am connecting string als parameter schätze ich


Anmelden zum Antworten