Probleme mit eigener recv-Funktion

cesupa

Erfahrenes Mitglied
Hallo,

bin grad dabei eine Socketklasse zu schreiben und hänge derzeitig an meiner recv-Funktion fest. Unzwar sollen die Daten nur dann empfangen werden wenn auch wirklich Daten gesendet wurden, damit die recv-Funktion nicht das ganze Programm zum Stoppen bringt. Das ganze versuche ich mit Hilfe von select() zu lösen nur leider gibt mir recv() immer -1 aus, und WSAGetLastError() gibt mir den Fehlercode 10045 aus, was so viel bedeutet wie eine nicht unterstützte Operation. Nur leider habe ich keine Ahnung, welche Operation da gemeint ist.

Code:
                        bool is=false;
                        char buf2[1025];
                        this->recv_bytes=0;
                        int n=0;
                        
                        do{
                        is=false;
                        
                        if(select(0,&this->fd,NULL,NULL,this->timeout)==SOCKET_ERROR)
                        {this->error=16;return false;}
                        
                        if(FD_ISSET(this->c,&this->fd))
                        {                                                    
                        
                        cout<<"Empfange Daten..."<<endl; 
                                                      
                        n=recv(this->c,buf2,1023,prot);                        //Fehler
                        if(n!=-1)
                        {
                        //Anweisungen
                        }
                        else
			{
                        cout<<"Fehler: "<<WSAGetLastError()<<endl; //10045
			}

                        }
                        }while(is && n!=-1);

So, das ist jetzt nur mal ein Ausschnitt vom betroffenen Code.
Ich hoffe ihr könnt mir da weiterhelfen :).

Gruß
cesupa
 
Hallo cesupa,

der erste Parameter von select() sollte nicht "0" sein, sondern die Nummer des höchsten Deskriptors + 1. Welchen Wert hat die Variable "prot" beim recv()-Aufruf und wie wird die Deskriptorliste "this->fd" initialisiert?

Gruß
MCoder
 
Hallo MCoder,

also bei c-worker.ch stand da, dass die erste Variable von select() unter Windows ignoriert wird, also 0 sein kann. Die Variable prot hat den Wert 0 und this->fd ist private und wird mit FD_ZERO(&this->fd); initialisiert (Ich wüsste sonst nicht wie ich das anders initialisieren soll:confused: )

Gruß
cesupa
 
also bei c-worker.ch stand da, dass die erste Variable von select() unter Windows ignoriert wird, also 0 sein kann.
Da hast du recht. Hab gerade noch mal in der MSDN nachgeschaut. Wird tatsächlich nur bei Unix bzw. Linux benutzt, aber nicht bei Windows.

Hast du vor dem select()-Aufruf nur FD_ZERO ausgeführt? Eine Zeile
Code:
FD_SET(this->c,&this->fd);
wird vorher auch noch benötigt.

Der recv()-Aufruf ist eigentlich in Ordnung. Die Fehlermeldung scheint auch darauf hinzudeuten, dass irgendwas mit den Parametern (möglicherweise der Socket) nicht passt. Was für eine Socket-Klasse programmierst du denn, ist es ein Server oder ein Client?

Gruß
MCoder
 
Also, bei dem Beispiel benutze ich einen Client. Dieser verbindet sich mit einem Server und sendet daraufhin "Hallo Welt.". Der Server empfängt das ganze und schickt es wieder zurück, heißt also er führt ein Echo aus. Jetzt soll der Client das zurück gesendete wieder empfangen und ausgeben.

Code:
FD_SET(this->c,&this->fd);

Wird ausgeführt sobald sich der Client mit dem Server erfolgreich verbunden hat.

Gruß
cesupa
 
Hm, an deinem Code sehe ich dann keinen Fehler. Hast du mal überprüft, ob der der erste Teil, also das Senden zum Server klappt?

Gruß
MCoder
 
Das Senden klappt wunderbar, der Server gibt dann auch "Hallo Welt." aus.
Wie kann so ein Fehler überhaupt entstehen?
 
Okay, ich hab den Fehler gefunden. Es lag doch an der Variable prot. Die war nämlich nicht 0 wie angenommen sondern 11. Obwohl ich in der Deklaration folgendes angegeben hab:

Code:
bool csocket_recv(char* buf,int size=-1,int prot=0);

Sollte demnach size nicht den Wert -1 und prot den Wert 0 haben?:confused:
Size hat den Wert 4.

Gruß
cesupa
 
Okay, hat sich jetzt alles erledigt. Ich sollte vielleicht mal zum Augenarzt gehen. Das ist nicht normal, dass ich soviel übersehe:-)

Gruß
cesupa
 
Ich hab schon wieder ein Problem mit recv(). Unzwar wenn ich viele Daten empfangen möchte, etwa eine Datei, dann speichert die recv() Funktion nur ein paar Bytes in das char-Array, sagt aber, dass sehr viel mehr Bytes empfangen wurden:confused:
Wie kann das sein?

Gruß
cesupa
 
Zurück