Socketprobleme



  • Hallo,

    meine Programmiererfahrungen sind noch nicht so sonderlich weit. Ich habe einen Beispielcode (siehe unten) der auch funktioniert und den ich jetzt gerne nach meinen Bedürfnissen umändern möchte. Es geht um das Senden über ein Socket, allerdings wird im Netzwerk RTnet (ein Echtzeitfähiges Netzwerkprotokoll) eingesetzt. Das Prinzip ist aber das gleiche, nur das die Methoden entsprechend anders heißen. Bei dem nun folgenden Beispielcode verstehe ich schon nicht ganz was die vier iov-Zeilen und die fünf msg-Zeilen machen sollen. So weit ich das sehe, wird lediglich ein struct versand, oder?

    Beispielcode: (funktioniert!)

    void xmit_msg(void *arg)
    {
        int ret;
        struct msghdr msg;
        struct iovec iov[2];
        unsigned short msgsize = size;
    
        rt_task_set_periodic(NULL, TM_NOW, CYCLE);
        while (1) {
            iov[0].iov_base = &msgsize;
            iov[0].iov_len  = sizeof(msgsize);
            iov[1].iov_base = buffer_out;
            iov[1].iov_len  = size;
    
            memset(&msg, 0, sizeof(msg));
            msg.msg_name    = &dest_addr;
            msg.msg_namelen = sizeof(dest_addr);
            msg.msg_iov     = iov;
            msg.msg_iovlen  = 2;
    
            printf("Sending message of %d+2 bytes\n", size);
            ret = rt_dev_sendmsg(sock, &msg, 0);
            if (ret == -EBADF)
                return;
            else if (ret != (int)(sizeof(msgsize) + size))
                printf(" rt_dev_sendmsg() = %d!\n", ret);
    
            rt_task_wait_period(NULL);
        }
    }
    

    Ich habe den Code nun vereinfacht, aber egal was ich mache, die Variable ret ist immer negativ, also das versenden klappt nicht.

    void xmit_msg(void *arg)
    {
        int ret;
        struct msghdr msg;
        struct iovec iov[2];
        unsigned short msgsize = size;
    
        rt_task_set_periodic(NULL, TM_NOW, CYCLE);
        while (1) {
            printf("Sending message...\n");
            ret = rt_dev_write(sock, "test", sizeof("test"));
            //auch probiert: ret = rt_dev_sendmsg(sock, "test", 0);        
            printf("ret: %d\n", ret);  //immemr negativ :(
            rt_task_wait_period(NULL);
        }
    }
    

    Kann mir jemand den Unterschied zwischen den beiden Varianten erklären? Was mache ich falsch? Haben diese oberen 9 Zeilen doch noch eine tiefgreifendere Bedeutung?

    Viele Dank!



  • Ich finde es wenig überraschend, dass sich die beiden Programme unterschiedlich verhalten, du benutzt ja schließlich auch ganz andere Funktionen!!!
    rt_dev_sendmsg() sendet eine Message an einen Socket, rt_dev_write() sendet eine Zeichenkette an ein Device. (Siehe auch den Link unten.)

    Die Variante, die in dem Kommentar steht 'rt_dev_sendmsg(sock, "test", 0);' kann ja nicht funktionieren, da rt_dev_sendmsg() ja als 2. Parameter einen Zeiger auf die Struktur msghdr und keinen String erwartet.

    Tipp: Sieh' dir doch das hier mal an.



  • Du hast natürlich Recht! Danke für den Hinweis.
    Jetzt wird auch so einiges klarer.


Anmelden zum Antworten