Etwas anderes als Strings über Sockets senden



  • Hallo,
    Ich versuche Bilder übers Netzwerk zu schicken, aber irgendwie wills nicht so richtig.
    Hier mein Code-Ausschnitt:
    Senden:

    HRESULT CNetSink::SendtoSocket(IMediaSample *pSample)
    {
        int bytes_sent = send(m_clientSocket, (char*)pSample, pSample->GetSize(),0);
    }
    
    if(bytes_sent == SOCKET_ERROR)
    {
        StereoLib::Msg("Couldn't send sample");
    }
    

    Empfangen:

    void CNetSourcePin::ReceiveFromSocket(IMediaSample *pSample)
    {
    	int bytes_received = recv(m_socket, (char*)pSample, pSample->GetSize(),0);
    	if(bytes_received == SOCKET_ERROR)
    	{
    		StereoLib::Msg("error receiving from socket");
    	}
    
    }
    

    Ich kriege immer SOCKET_ERROR vom send-Befehl zurück, aber ich weiss nicht warum.
    Wenn ich einfach einen char[] verschicke, funktioniert das ganze ohne Probleme.

    Meine Gedanken dazu:

    - dieser cast zum char* ist irgendwie komisch, aber sonst wollte send den Pointer nicht haben.
    - das es ganz so einfach nicht funktionieren wird, weil nicht klar ist, wieviel von dem Zeugs tatsächlich gesendet wird, ist mir klar. Aber irgendwo muss ich ja anfangen.

    Wäre toll, wenn mir jemand helfen könnte!!

    Zora



  • WSAGetLastError



  • Du bist sicher dass der Zeiger auf die Klasse auf den Anfang der tatsächlichen Bilddaten zeigt, ja?



  • der Zeiger zeigt nicht auf den Anfang der Bilddaten. Allerdings dachte ich mir, ich kann ja auch das ganze Ding verschicken, oder ist das blöd?

    Werde mir den LastError mal anschauen, danke!



  • Bad address.
    The system detected an invalid pointer address in attempting to use a pointer argument of a call. This error occurs if an application passes an invalid pointer value, or if the length of the buffer is too small. For instance, if the length of an argument, which is a sockaddr structure, is smaller than the sizeof(sockaddr).



  • ich denke es liegt an GetSize. Setz mal nur zum Testen da z.B. ne 4 hin.



  • ja, hast recht. Es liegt wohl daran. Danke..

    Vielleicht ist es doch gescheiter, nur die Bilddaten zu schicken 😕



  • Was willst Du auch mit dem ganzen Objekt? Das wäre ja auch dem anderen Rechner wo's dann ankommt nicht korrekt konstruiert und Du dürftest es sowieso nicht als Objekt verwenden.



  • nun, irgendetwas kommt an. Ich denke, ich muss daran arbeiten, dass ganze Bild zu empfangen, bevor wirklich klar wird, ob es funktioniert..
    Danke für eure Hilfe!!
    Werd mich melden, wenn ich eine Lösung hab. (oder mehr fragen :-))



  • Jester schrieb:

    Was willst Du auch mit dem ganzen Objekt? Das wäre ja auch dem anderen Rechner wo's dann ankommt nicht korrekt konstruiert und Du dürftest es sowieso nicht als Objekt verwenden.

    Ja, du hast recht.



  • ich habs tatsächlich geschafft, die Samples zu verschicken.
    Das ganze funktioniert wunderbar von Computer A nach Computer B. Auch von Computer B nach Computer A funktioniert ohne Probleme. Nur, wenn ich beides gleichzeitig machen will, gehts irgendwann nicht mehr. Ich hab so das Gefühl, dass es irgendwo so eine Art deadlock gibt.
    Meine Fragen:

    1. gehe ich richtig in der Annahme, dass die recv() methode blockt, bis es was zu empfangen gibt?
    2. wie krieg ichs hin, dass das program nicht blockiert, wenn es mal grad nix zu empfangen gibt? (Timer oder sowas)

    Ich weiss, es gibt auch asynchrone sockets, aber da braucht man dann ja die wndproc, die die events empfängt, und es wäre mir sehr lieb, wenn ich das nicht machen müsste, weil das ganze Program eh schon ziemlich kompliziert ist (directshow 😡 ), und ich mir das nicht auch noch antun möchte, falls es irgendwie zu umgehen ist 🙂


Anmelden zum Antworten