Socketserver; TCP/IP; pTHreads

Hast du meinen Beitrag auch mal gelesen?

Vielkerniger Prozessor ist ziemlich teurer Spaß, auf jedem Rechner...
Warum nicht select etc.?
 
Hallo, ich habe ein weiteres Problem:

Wenn ich Zeichen versende, die über die 127 ANSI Zeichen hinausgehen, dann sind die Chars ja auf einmal größer ... und werden daraufhin noch dazu falsch von meiner MySQL tabelle interpretiert.

z.B. wird ä wird zu 'ä' und das letzte Zeichen des Strings fällt raus ...

Wie verschicke ich am Besten Texte über einen Socket-Server?
Vielleicht werden ja auch irgendwann chinesische Zeichen versendet ... soll ich die Strings in int arrays umwandeln und mich auf eine Codierung festlegen, oder wie mach ich das am dümmsten?

Vielen Dank für die Hilfe!
Mit freundlichen Grüßen
Genius
 
Auch wenn du es gut ignorierst, ein Thread pro Socket frisst Leistung.

Zum neueren Problem:
Die chars werden nicht größer, bleiben immer 1 Byte.
Die scheinbare Verdoppelung hängt auch mit dem Zeichensatz zusammen.

Verwende Convert.

Zu den chinesischen (etc.) Zeichen: Falls es wirklich internationalisierbar sein soll
musst du schon das C-Programm anpassen, nicht erst den SQL-Teil.
Kein Iso8859-1 mehr, sondern zB. Utf8.
Es existieren auch verschiedene Libs, die den Umgang erleichtern.
 
Mein code sieht nun so aus - und trotzdem wird der Datensatz von der SQL-Datenbank nicht richtig interpretiert:

Code:
char buchstabenkette[] = "-§xÄ"
char query_insert[190];

sprintf(query_insert, "INSERT INTO tabellenname (spaltenname) VALUES (CONVERT('%s' USING utf8)), buchstabenkette);

mysql_query(verbindung, query_insert);

In der Datenbank steht dann: -§xÄ

Die Spalte ist mit utf8_general_ci konvertiert.

Was mache ich falsch?

Mit freundlichen Grüßen
Genius
 
Zuletzt bearbeitet:
Du musst auch den derzeitigen Zeichensatz angeben.
Siehe erstes Beispiel im Link:
SQL:
CONVERT(_latin1'Müller' USING utf8)
_latin1'%s' ...
 
Mhm okay ... und woher weiß ich in welchem Format es ankommt?

Wenn ich zum Beispiel den Client unter linux gcc compile, dann werden die Daten (zum Teil Ä, Ü, Ö stimmen zumindest bei § verhaut er es auch) richtig in die DB eingetragen.

Wenn ich den Char aber unter objectiveC befülle und sende, stimmen nicht mal die Äs Üs und Ös ...

Ich gehe davon aus, dass sie unterschiedliche Zeichensätze verwenden ... wie kann ich bestimmen in welchem Format mein char befüllt wird?

Mit freundlichen Grüßen
Genius
 
Ich kämpfe gerade ein wenig mit der select() Funktion.

Code:
int select(int nfds, fd_set *readfds, fd_set *writefds,
           fd_set *exceptfds, struct timeval *timeout);
Mir ist nicht so wirklich klar für was nfds gut ist - ich weiß, dass ich es auf den maximalen Sockethandler + 1 setzten muss - aber für was ist das gut!?

Ich hoffe mal, select überprüft nur die Verbindungen, die ich ihm in das entsprechende Set eingetragen habe - oder überprüft select() alle potentiellen Sockets von 0 bis nfds auf "ready for read" bzw. "ready for write"?!

Wenn ich zwei threads habe, beide sind mit einer select-Funktion ausgestattet - der erste soll alle Socketverbindungen von (5-64) und der andere von (65-128) verarbeiten - muss ich dann einmal nfds auf 65 und einmal auf 129 stellen - und pfuscht dann der zweite thread auch wirklich nicht in den Verbindungen 5-64 rum!?

accept() führe ich in der main() aus - übertrage anschließend den Sockethandler an den jeweiligen thread und füge ihn da via FD_SET() zum entsprechenden set hinzu.

Vielen Dank!
Mit freundlichen Grüßen
Genius
 
Zurück