Winsock : unbegrenzte datenmenge senden



  • hallo leute,

    ich habe mit winsock ein server- und ein clientproggie geschrieben, was soweit auch ganz gut klappt, nur wenn ich mehr daten versenden will als auf einmal möglich ist (also den rest in einer schleife nachsende) kommt auf der andern seite nicht mehr alles an. ich hab das mal in eine klasse verpackt und da beim versenden kleiner textnachrichten alles klappt denke ich, dass nur folgende zwei methoden wichtig sind:

    bool Socket::send( const std::string& s ) const 
    {	
    	int ret=0;
    	std::string avail=s;
    	std::ifstream is(avail.c_str());
    
    	if(is.is_open())
    	{
    		std::getline(is, avail, static_cast<char>(EOF));
    		is.close();
    	}
    
    	do
    	{
    		ret = ::send ( sock, avail.c_str(), avail.size(),  0 );		
    		if ( ret == -1 ) 
    			return false;
    
    		avail.erase(0, ret);
    
    	}while(ret>0);
    
    	return true;
    }
    
    int Socket::recv ( std::string& s ) const 
    {
    	int ret=0;
    	char buf [ MAXRECV + 1 ];
    	s = "";
    	do
    	{
    		memset ( buf, 0, MAXRECV + 1 );
    		ret = ::recv (sock, buf, MAXRECV, 0 );
    
    		if ( ret == -1 )
    		{
    			throw std::runtime_error("Fehler beim Senden aufgetreten.");
    			return ret;
    		}
    		else
    		{
    			s.append(buf);
    		}
    
    	}while(ret>0);
    
    	return s.size();
    }
    

    Es kommt genau soviel an wie wenn ichs ohne schleife mache. was mache ich da falsch? oder kann es sein dass die schleife zum senden/empfangen in die main-funktion sollte? ausserdem würde mich noch interessieren: wie verwende ich die getline-funktion korrekt, sodass alles auf einmal eingelesen wird (also schon noch bis EOF aber ich kann ja EOF (int) nicht so einfach nach char casten oder? ) ?

    vielen dank schonmal im voraus 🙂



  • weiss denn keiner wie man das richtig macht ?? 😞



  • jimmy3 schrieb:

    weiss denn keiner wie man das richtig macht ?? 😞

    Du musst mehrere male recv audführen, um alle Daten zu empfangen. Es muss außerdem nicht sein, dass alle Daten die du mit einem send abgeschickt hast auch mit einem recv ankommen. Es kann sein, dass du mehrere recv brauchst. Es kann auch sein, dass du mit einem recv Daten, die du mit mehreren sends geschickt hast, empfängst.

    Du musst also in einer Schleife empfangen und die Daten wieder auseinanderpflücken, so wie du sie haben willst.



  • Er hat eine Schleife...



  • do while schrieb:

    Er hat eine Schleife...

    Vielleicht Asynchrone Sockets?

    Er sollte mal mit einem Debugger durch das Programm gehen und schauen, ob die Nachricht nur nicht so gespeichert wird, wie er das möchte und desswegen nicht angezeigt wird, weil er zum Beispiel die NULL mit sendet oder so, oder ob es wirklich am recv liegt.

    Ich sehe an der Stelle keinen Fehler. Würd mal tippen, der liegt woanders.


Anmelden zum Antworten