== Suche hilfe bei DB-Telefon Projekt ==
-
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 schickebin 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 umwandeleund 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... /EditFü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 giebtwandelt 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 initialisierene: 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 rauszuscheidengibts doch sicherlich ne funktion
-
hallo ich brauch mal wieder hilfe
hat jemand erfahrung mit cpp ODBC?
ich will ja an den filmaker anbendelnblos 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.aspxschätze mal es liegt am Connection string
habe mir den richtigen für den filemaker hier rausgesucht
http://www.connectionstrings.com/default.aspx?carrier=filemakerfunzt aber trozdem nicht
treiber ist installiert - checkhabe 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 reinhabs 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 allochandleringweil 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