Sock Send Methode



  • Hi! Ich wollte mal fragen, ob meine Methode für send so in Orndung ist:

    long MultiSocket::Send(char* szSend, int nLength)
    {
    	return Send(szSend, nLength, Socket);
    }
    
    long MultiSocket::Send(char* szSend, int nLength, SOCKET Sock)
    {
    	long rc = -1;
    	long is = 0;
    	long to = nLength;
    	char* szTo = new char[strlen(szSend) + 2];
    
    	while(is <= (to -1))
    	{
    		for(int i = 0; i < to; i++)
    		{
    			szTo[i] = szSend[is + i];
    		}
    		szTo[strlen(szSend) + 0] = '\0';
    		szTo[strlen(szSend) + 1] = '\0';
    
    		#ifdef DEBUG
    			std::cout << "Send: " << to << ":" << is << ";" << (to - is) << "#" << szSend << "-" << szTo << std::endl;
    		#endif
    
    		rc = send(Sock, szTo, (to - is + 1), NULL);
    		if(rc == SOCKET_ERROR)
    		{
    			std::cout << "Send error: " << WSAGetLastError() << std::endl;
    			return WSAGetLastError();
    		}
    		is += rc;
    	}
    
    	delete [] szTo;
    	return 0;
    }
    

    Send ist ja leider keine Garantie, dass alle angegebenen Bytes auch gesendet werden und so hab ich mir diese Methode augedacht. Jetzt möchte ich noch sicher gehen, dadd diese auch zu 100% funktioniert.
    Gruss, fushigi

    EDIT: Kleine Verbesserung am Code.



  • Das Umkopieren des zu sendenden Daten halte ich für sinnlos*. Du kannst problemlos mit dem übergebenen Speicherbereich arbeiten und zur Not einen Zeiger in die Mitte des Arrays verwenden.

    *außerdem ist es nicht gerade sicher wie du mit strlen arbeitest - ich glaube nicht, daß der übergebene Speicherblock null-terminiert ist.



  • Dein Code ist grauenhaft. Keine Lust mir das anzusehen.



  • fushigi schrieb:

    Send ist ja leider keine Garantie, dass alle angegebenen Bytes auch gesendet werden

    Das kommt darauf an: Unter Windows mit einem blockierenden Socket macht send alles oder nichts.
    Für das Gegenstück recv gilt das nicht - dort muss immer geprüft werden, ob die erwartete Datenmenge geliefert worden ist.



  • 314159265358979 schrieb:

    Dein Code ist grauenhaft. Keine Lust mir das anzusehen.

    Den Post hättest du dir sparen können.
    (Das selbe gilt für mich, wollte es aber nur loswerden)


Anmelden zum Antworten