PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C] Server Socket Problem



suse
15-05-2003, 18:06
Hi,

habe mir vollgenden Server Socket geschrieben;



#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main()
{
int server_socket, client_socket;
int laenge, ende;
int zahl = 0;
struct sockaddr_in serverinfo, clientinfo;
char empfangene_zeichen[1000];
char puffer[100]; // Puffer fuer die sprintf() Funktion
char web_seite[] ="HTTP/1.1 200 OK\r\n\r\n\
<html><body><h1><center>Hallo Web-World</center></h1></body></html>";

server_socket = socket(AF_INET, SOCK_STREAM, 0);

serverinfo.sin_family = AF_INET;
serverinfo.sin_addr.s_addr = inet_addr("192.168.123.13");
serverinfo.sin_port = htons(5000);
laenge = sizeof(serverinfo);


while(1) //Start der Endlosschleife
{
zahl++;
bind(server_socket,(struct sockaddr*)&serverinfo, laenge);

listen(server_socket, 3);

//printf("\n Der Server wartet.....\n");

client_socket = accept(server_socket, (struct sockaddr*)&clientinfo, &laenge);
//printf("\nVerbindung mit %s war erfolgreich!\n", inet_ntoa(clientinfo.sin_addr));

sprintf(puffer,"<html><body><center>Du bist mein %d Besucher</center></body></html>",zahl);
read(client_socket, empfangene_zeichen, sizeof(empfangene_zeichen));
write(client_socket, web_seite,sizeof(web_seite));
write(client_socket, puffer,sizeof(puffer)); //neuer puffer gibt die
//Anzahl der Verbindungen an
close(client_socket);

} // ende der Endlossschleife

close(server_socket);

printf("\nServer beendet");
}


Doch leider liefert mir der Puffer immer wieder Schrott im Brauser.
Alles ander läuft wunderbar. Ich bekomme so eine Meldung im Browser;

Hallo Web-World
Du bist mein 10 Besucher
@ôõÿ¿_Ú@4€GET /

Die ersten beiden Zeilen sind ok doch die letzte sollte er mir garnich liefern...
Weisst einer von euch woran das liegen kann.

gruss
suse

anda_skoa
15-05-2003, 18:19
Sieht mir nach C aus, nicht nach C#

1) du solltest das bind und listen nur einmal machen, also außerhalb der Schleife.

2) wäre e günstig, im HTTP header anzugeben, dass das Dokument vom Typ text/html ist

3) solltest du dann nur ein html Dokument übertragen.
Am besten du lässt im ersten String das body und html Entag weg und machst im zweiten String keine Anfang.

4) dein Problem liegt darin, dass du den ganze puffer überträgst, statt nur den gefüllten Teil
strlen(puffer) statt sizeof

Ciao,
_

suse
15-05-2003, 18:28
Danke erstmal für die schnelle Antwort...
Es klappt jetzt mit der strlen() Funktion...
Danke...

Wenn ich das Bind und listen ausßerhalb der Schleife mache dann läuft er aber nicht in meiner Endlosschleife, oder...

Aber danke für den Tip...
Hast du vielleicht einen Link für mich... Wo ich solche informationen finde!

anda_skoa
15-05-2003, 19:28
Original geschrieben von suse
Wenn ich das Bind und listen ausßerhalb der Schleife mache dann läuft er aber nicht in meiner Endlosschleife, oder...


bind bindet den Socket an das Interface/die Interfaces und den gegeben Port.
listen teilt dem Betriebsystem mit, dass auf diesem Port Connects erwartet werden.

Das ist praktisch die Setup-Phase eines Server Sockets.

Im Betrieb muss er nur mehr Client Verbindungen entgegen nehmen, was er mit accept macht.



Aber danke für den Tip...
Hast du vielleicht einen Link für mich... Wo ich solche informationen finde!

Ich denke da sollte sich genug finden lassen, wenn man nach "socket programming" bzw. "socket programmierung" sucht.

Eventuell zusätzlich mit dem Stichwort unix oder linux.
Selbst hier im Forum gibts dazu einige Beiträge.

Ciao,
_