Struktur über Winsock versenden



  • Hi an alle,

    ich habe eine Struktur für ein RTP Packet.
    Ungefähr so:

    struct rtppacket
    {
        unsigned int version:2;         /* protocol version */
        unsigned int padding:1;         /* padding flag */
        unsigned int extension:1;       /* header extension flag */
        unsigned int csrcccount:4;      /* CSRC count */
        unsigned int marker:1;          /* marker bit */
        unsigned int payloadtype:7;     /* payload type */
        unsigned int sequencenumber:16; /* sequence number */
        u_int32_t timestamp;            /* timestamp */
        u_int32_t ssrc;                   /* synchronization source */
        u_int32_t csrc[1];
        void* datap;
        int datalen;
    }
    

    ich fühle diese Struktur nun mit den relevanten Daten und möchte dies dann via UDP über sendto versenden. Wie muss ich das ganze casten dass es korrekt überkommt?

    Muss ich mit RAWSockets arbeiten oder geht das auch mit normalen sockets?

    Gruß

    CrazyPlaya



  • ich glaub die send funktion erwartet ein char pointer auf ein array.

    //struktur erzeuen
    rtppacket data;
    
    //Casten
    send(..., (char*)&data,sizeof(rtppacket),0);
    

    evtl. padding abschalten



  • das hab ich bereits so gemacht.

    padding ist auf false.

    Wenn ich aber nach dem Sendto mit packetyzer in die RTP Packete reinschaue bekomme ich immer RTP: unknown Verion = 0 ausgegeben. Da kann ja noch irgendwas nicht stimmen.

    Also anbei mal ein wenig mehr Code wie ich das Packet fülle und sende:

    m_rtpPack.version = 2;
    m_rtpPack.sequencenumber = 1;
    m_rtpPack.csrc[0] = 0;
    m_rtpPack.csrcccount = 0;
    m_rtpPack.extension = 0;
    m_rtpPack.marker = 1;
    m_rtpPack.payloadtype = 0;
    m_rtpPack.padding = 0;
    m_rtpPack.ssrc = 0;
    m_rtpPack.timestamp = GetTickCount();
    ...
    //Buffer füllen
    ...
    m_rtpPack.datap = szBuffer;
    m_rtpPack.datalen = sizeof(szBuffer); //= 1024
    
    nSend = sendto(m_Socket, (char*)&m_rtpPack, sizeof(m_rtpPack), 0, (SOCKADDR*)&m_saRemote, sizeof(SOCKADDR));
    

    So sollte es ja eigentlich funktionieren habe ich gedacht;)



  • Das funktioniert mit normalen Sockets.

    Was passiert denn auf der anderen Seite der Verbindung?
    Kommt nix an?
    Kommt es beschädigt an?



  • Ich habe auch mal sowas geschrieben und poste es mal.
    Dieser Code stammt aus einem funktionierenden Projekt.
    Kannst ja mal nachsehen ob du Unterschiede findest.

    struct Daten: Nachricht {

    int verzoegerung;
    int current_time;
    int Punkte_links;
    int Punkte_rechts;

    float rechts_x;
    float rechts_y;

    float links_x;
    float links_y;

    float ball_x;
    float ball_y;

    float ballrichtung_x;
    float ballrichtung_y;

    };

    Daten *d1= new Daten(1,0,3,3,5,0,5,0,6,0,1,0);

    send(connectedSocket,(const char*)d1, sizeof(Daten),0);



  • @ MisterX: es kommt zwar was an auf der anderen Seite. Aber damit kann sie nix anfangen. Ich werde es mal auf deine Weise probieren. Danke



  • das geht natürlich, du machst offensichtlich was falsch und mit padding ist gemeint padding durch den compiler zu unterbinden bei strukturen die man übers netzwerk schickt 👎



  • @asdca: Ok diese Antwort ist ja tatsächlich hilfreich. Sorry dass ich mich im anderen Thread so aufgeregt habe aber du musst selbst zu geben dass deine Antwort eher so Klang wie "Igiit DirectX nimm lieber was anderes sonst helf ich dir nicht". Sorry auch dass ich etwas ausfallender geworden bin. Aber so was kotzt mich manchmal echt an in Foren, denn zur Hilfestellung sind Sie schließlich da. Klar wenn jemand fertigen Code will hat er keine Hilfe verdient und soll mal schön googeln, dass seh ich genauso aber gerade mit den libs einbinden sind nun mal typische Anfängerfehler und wenn du dass nicht weißt wonach willste suchen? Höchstens nach der Fehlermeldung so hab ich es früher immer gemacht. Aber eagl, dass gehört nicht hierhin.

    Allerdings danke schön nochmal für den Hinweis ich vergesse jedesmal den Sch... im VS umzustellen. Können die das nicht defaultmäßig korrekt einstellen:).

    Ciao

    Crazy



  • Hi,
    kann mir jemand die Bedeutung des mit : getrennten Wertes in der Struktur genauer erklären? Ich finde nichts darüber beim googlen was diese Werte bezwecken.



  • mr. main schrieb:

    Hi,
    kann mir jemand die Bedeutung des mit : getrennten Wertes in der Struktur genauer erklären? Ich finde nichts darüber beim googlen was diese Werte bezwecken.

    was is los?

    und du stellst das natürlich nicht in den projekt einstellungen ein sonst gilt es logischerweise für alle strukturen. schonmal was von pragma pack gehört?



  • asdca schrieb:

    was is los?

    na z.B. diese Deklaration innerhalb der Struktur(unsigned int version:2 ). Sorry bin noch Anfänger und dabei dies alles zu lernen.



  • Doch ich kenn pragma.
    Aber ist eh eine vorgegebene Einstellung hier in der Firma, dass die Compiler Option auf Zp1 eingestellt wird.

    Aber ich habe es auch vorher mit

    #pragma pack(push, 1)
    ...
    struktur
    ...
    #pragma pack(pop)
    

    getestet. Aber dennoch der gleiche Fehler.



  • Ist das ein default wert? Oder hat das was mit der Anzahl der zu nutzenden Bits zu tun?



  • Ist das ein default wert? Oder hat das was mit der Anzahl der zu nutzenden Bits zu tun?

    Genau. Die Anzahl der Bits werden dabei festgelegt.
    Schreibst du z.B.

    unsigned int x : 2;
    

    ,

    so ist deine Variable x in deiner Struktur lediglich 2 Bit breit und nimmt nicht die kompletten 32 bit eines Integers in Anspruch.

    Greetz
    Xzi-bit



  • So ich habe das Problem gelöst. Es lag daran, dass die network byte order in meiner struktur für big endian war und windows aber mit little endian arbeitet. Nachdem ich die Reihenfolge geändert habe klappts auch mit dem Versenden des Packets.



  • Es lag daran, dass die network byte order in meiner struktur für big endian war und windows aber mit little endian arbeitet. Nachdem ich die Reihenfolge geändert habe klappts auch mit dem Versenden des Packets.

    Köntet du mir vieleicht verraten WIE man sowas konkret ändert?



  • Eigentlich habe ich mir nur rausgesucht, wie die Reihenfolge in der Struktur sein muss und habe dieses umgestellt.

    //Anstatt so
    struct rtppacket 
    { 
        unsigned int version:2;         /* protocol version */ 
        unsigned int padding:1;         /* padding flag */ 
        unsigned int extension:1;       /* header extension flag */ 
        unsigned int csrcccount:4;      /* CSRC count */ 
        unsigned int marker:1;          /* marker bit */ 
        unsigned int payloadtype:7;     /* payload type */ 
        unsigned int sequencenumber:16; /* sequence number */ 
        u_int32_t timestamp;            /* timestamp */ 
        u_int32_t ssrc;                   /* synchronization source */ 
        u_int32_t csrc[1]; 
        void* datap; 
        int datalen; 
    } 
    
    //so
    struct rtppacket
    {
        u_int16_t cc:4;		/**< CSRC count			    */
        u_int16_t x:1;		/**< header extension flag	    */ 
        u_int16_t p:1;		/**< padding flag		    */
        u_int16_t v:2;		/**< packet type/version	    */
        u_int16_t pt:7;		/**< payload type		    */
        u_int16_t m:1;	
        u_int16_t seq:16;   /* sequence number */
        u_int32_t ts;       /* timestamp */
        u_int32_t ssrc;     /* synchronization source */
        u_int32_t csrc[1];  /*
    }
    

    Wie genau man herausfindet welches Endian das System verwendet muss ich selbst noch recherchieren:)


Anmelden zum Antworten