Nach Socketkommunikation schreibt printf ins Nirvana
-
Hi,
meine Aufgabe ist eine Verbindungsverwaltung für eine Steuerungsplatine (angeschlossen via USB) unter Linux (Debian) zu schreiben.
Das Programm soll als Server dienen und Verbindungen von PHP Clients annehmen. Angesiedelt ist es als Adapter zwischen PHP Clients und der Steuerungsplatine.
Sollte dies von Belang sein, kann ich das detaillierter ausführen.
do { clsock = accept( sock, (struct sockaddr *) &client, &len ); printf( "client connected: %d\n", clsock ); if( fork( ) == 0 ) { int pid = getpid( ); int msglen = 0; char puffer[MAXPUF]; char response[8] = "received"; printf( "fork started with pid %d..\n", pid ); /* do stuff here */ msglen = recv( clsock, puffer, MAXPUF, 0 ); send( clsock, "received", 8, 0 ); printf( "test" ); printf( "Incomming data in socket %d: %s", pid, puffer ); } } while( TRUE );
Nachdem ich via send( ) den String geschickt habe, schreibt auch printf( ) nur noch über den Socket. Das liegt bestimmt daran, dass beide auf File Streams basieren. Irgendwie scheint mein STDOUT auf das Socket umgeleitet zu werden.
Zur Analyse habe ich zwischen PHP Client und C Server das Programm interceppty von Scott W. Gifford (http://www.suspectclass.com/sgifford/interceptty/) geschaltet.
Zuerst starte ich den Server:
amarium:/usr/local/bin/c# gcc -o mcu_ipc mcu_ipc.c && sudo ./mcu_ipc listening @ 40234...
Dann starte ich Interceppty was auf Port 40234 connected und auf Port 40235 lauscht:
amarium:~# interceptty @127.0.0.1:40234 @127.0.0.1:40235
Meine Ausgaben im C Programm melden sofort:
client connected: 4 fork started with pid 30129..
Das C Programm wartet nun auf eingehende Daten der gestarteten Verbindung.
Und nun sende ich über ein kleines PHP Script auf 40235 ein Hallo Welt:
$socket = socket_create( AF_INET, SOCK_STREAM, 0 );//SOL_TCP ); socket_connect( $socket, "127.0.0.1", 40235 ); sleep( 1 ); $res = socket_write( $socket, "hello world" ); var_dump( $res ); flush( ); sleep( 3 ); socket_close( $socket );
Schau ich nun in die Übertragungslogs die interceptty mir ausspuckt les ich folgendes:
< 0x68 (h) < 0x65 (e) < 0x6c (l) < 0x6c (l) < 0x6f (o) < 0x20 < 0x77 (w) < 0x6f (o) < 0x72 (r) < 0x6c (l) < 0x64 (d) > 0x72 (r) > 0x65 (e) > 0x63 (c) > 0x65 (e) > 0x69 (i) > 0x76 (v) > 0x65 (e) > 0x64 (d) > 0x00 > 0x74 (t) > 0x65 (e) > 0x73 (s) > 0x74 (t) > 0x00 > 0x00 > 0x49 (I) > 0x6e (n) > 0x63 (c) > 0x6f (o) > 0x6d (m) > 0x6d (m) > 0x69 (i) > 0x6e (n) > 0x67 (g) > 0x20 > 0x64 (d) > 0x61 (a) > 0x74 (t) > 0x61 (a) > 0x20 > 0x69 (i) > 0x6e (n) > 0x20 > 0x73 (s) > 0x6f (o) > 0x63 (c) > 0x6b (k) > 0x65 (e) > 0x74 (t) > 0x20 > 0x25 (%) > 0x64 (d) > 0x3a (:) > 0x20 > 0x25 (%) > 0x73 (s) > 0x00 > 0x72 (r) > 0x65 (e) > 0x63 (c) > 0x65 (e) > 0x69 (i) > 0x76 (v) > 0x65 (e) > 0x64 (d)
Hier kommt noch einiges mehr rein an Zeugs, da MAXPUF den Inhalt von 250 hat.
Aber man sieht schon, dass printf nun nicht mehr zu STDOUT sendet, sondern zum Socket.Gibt es eine Möglichkeit nach send() den printf wieder umzustreamen?
Vielen Dank
Dennis
-
Hi,
kannst du statt printf mal mit
write(1, "test", 4);
testen?
oder nutze statt send mal
write( clsock, "received", 8 );
-
Was hälst du denn davon den String auch den Platz zu geben, den sie benötigen.
char response[8] = "received"; :rolling_eyes:
Sind zwar 8 Buchstaben, dazu kommt noch die '\0' macht also 9.
Lass das den Compiler machen:
char response[] = "received";
der macht das richtig, immer.
Und dann schau mal nach, ob du nicht noch woanders solche Macken hast.