PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Clientproblem



Shack
11-12-2002, 16:12
Hi nochmal,

habe gestern schon mal angefragt, wie man es macht das ein Client ständig in der Lage
ist Daten zu empfangen.
Hab darauf als Tip die Funktion select() bekommen.
Leider funkt es aber nicht so wie ich es will. Will sagen er empfängt nur einmnal
und rennt dann durch dei Schleife ohne auf neue Daten zu reagiern.

Hab mal mein Code rangehängt ( vereinfacht ) , vieleicht kann mir ja jemand auf die Sprünge helfen.

Vielen Dank
Shack

connect(sock, (struct sockaddr *)&host_addr, sizeof(host_addr))==-1)
fcntl( sock, F_SETFL, mode | O_NONBLOCK);

FD_ZERO( &readfd);
FD_SET( sock, &readfd);

while( 1 ) {

select( sock +1 , &readfd, &writefd, NULL, NULL );

if( FD_ISSET( sock, &readfd) )
size = recv(sock, buffer, 1000, 0);

printf("Getting %d Bytes of Data\nData:%s\n",size,buffer);
} //while

anda_skoa
11-12-2002, 19:03
Hmm, versuchs mal ohne NON_BLOCK und check den Returnwert von select.

Ciao,
_

Shack
12-12-2002, 13:09
ja ohne NonBlock funkt es auch nicht

mode = fcntl( sock, F_GETFL, 0 );
fcntl( sock, F_SETFL, mode );

der return von selct ist nach dem ersten lesen immmer 1

hätte ja nicht, dass das so kompliziert ist einen client in c zu proggen.

anda_skoa
12-12-2002, 13:55
Original geschrieben von Shack
ja ohne NonBlock funkt es auch nicht

mode = fcntl( sock, F_GETFL, 0 );
fcntl( sock, F_SETFL, mode );


Mal ganz ohne das fcntl.



der return von selct ist nach dem ersten lesen immmer 1


Also select gibt in jedem Durchlauf 1 zurück?
Oder nur beim ersten Mal?

Wieviele fd sind denn in den beiden FD sets?

Ciao,
_

Shack
12-12-2002, 15:04
ohne fcntl funkt es leider auch nicht.

und der return von select ist vor dem ersten lesen 0 , danach
immer 1.

in meinem fd_set hab ich genau einen describtor( zum lesen ).

geht das dann nicht auch ohne select() ?

anda_skoa
12-12-2002, 15:50
Wenn er 0 lieftert solltest du nicht versuchen zu lesen.
Denn select liefter immer die Anzahl der FDs, die bereit sind.

Der Vorteil von select ist, dass man ein timeout angeben kann und somit nicht ewig blockiert.

Allerdings hab ich selber noch nie was mit select gemacht.
Schreib mal eine PN an mithras, bzw. such dessen Postings zu select.

Ciao,
_

Shack
12-12-2002, 16:13
mach ich ja auch nicht , select wartet bis zur ersten Eingabe danach ist return 1
und ich lese dann auch zu ersten Mal.

haste ne Idee wie man select umgehen kann ? hab ja nur einen Describtor ?

The Ripper
12-12-2002, 21:21
Muss dein Programm noch was anderes machen, während auf Daten gewartet wird? Wenn nicht kannst du nämlich einfach select() weglassen.

Die Seite mit Codebeispielen hab ich mit Google gefunden: http://www.linuxsocket.org/books/Sockets/programs/

xmarvel
19-12-2002, 15:03
hi shack

Leider kann ich dir nicht helfen denn ich habe genau das selbe Problem. Ich empfange ständig Daten vom Server da dieses ja blockierend ist fängt das Programm vom Client total an zu stocken.
Wenn du eine Lösung zum Problem gefunden hast dann poste die mal bitte.
Inmoment benutze ich in meinem Programm noch nicht mal select da ich auch nur ein deskriptor benutze. Irgendwie muss es doch gehen das das empfangen der Daten nicht blockierend ist.

MFG
xmarvel