【问题标题】:Receiving payload along with ancillary data in transmit timestamp packets in linux socket在linux套接字中的传输时间戳数据包中接收有效负载以及辅助数据
【发布时间】:2017-02-09 08:15:03
【问题描述】:

我正在尝试根据Linux documentation在我的数据包上传输硬件时间戳
正如它所说,带时间戳的数据包无需任何修改就被传输回errorQueue,所以我应该在那里看到我的有效负载数据,但我不能。
我在有效负载中放置了一个唯一 ID 来识别每个数据包,但是当我在 errorQueue 中收到它时它显示为空。
所以问题是:为什么我没有在 errorQueue 中收到我的有效负载以及辅助数据(具有我请求的硬件时间戳)
我添加了部分相关的代码,希望有人能提供帮助。
提前致谢。

while (1) {

    make_address(0, &remote);
    iov.iov_base = buffer;
    iov.iov_len = 2048;
    msg.msg_iov = &iov;
    msg.msg_iovlen = 1;
    msg.msg_name = &remote;
    msg.msg_namelen = sizeof(struct sockaddr_in);
    msg.msg_control = control;
    msg.msg_controllen = 1024;

    send_iov.iov_base = send_buffer;
    send_iov.iov_len = 2048;
    sendm.msg_iov = &send_iov;
    sendm.msg_iovlen = 1;
    sendm.msg_name = &remote;
    sendm.msg_namelen = sizeof(struct sockaddr_in);
    sendm.msg_control = 0;
    sendm.msg_controllen = 0;

    iov2.iov_base = buffer2;
    iov2.iov_len = 4096;
    msg2.msg_iov = &iov2;
    msg2.msg_iovlen = 1;
    msg2.msg_name = &remote;
    msg2.msg_namelen = sizeof(struct sockaddr_in);
    msg2.msg_control = control;
    msg2.msg_controllen = 1024;


    FD_ZERO(&readfs);
    FD_ZERO(&errorfs);
    FD_SET(sock, &readfs);
    FD_SET(sock, &errorfs);
    delta.tv_sec = 5;
    delta.tv_usec = 0;
    /* read a datagram from the socket (put result in bufin) */
    res = select(sock + 1, &readfs, 0, &errorfs, &delta);

    n = (int) recvmsg(sock, &msg, MSG_DONTWAIT);
    if (n >= 0) {
        char* temp = msg.msg_iov[0].iov_base;
        printf("REQ %s \n", temp);
        char* sss = handle_time(&msg,1);

        sscanf(temporary_char_array, "%d", uid); // add Unique ID
        msg.msg_iov[0].iov_base = temporary_char_array;
        uid++;

        f = (int) sendmsg(sock, &msg, 0);
        free(sss);
    }

    n = (int) recvmsg(sock, &msg2, MSG_DONTWAIT | MSG_ERRQUEUE);
    if (n >= 0) {
      char* temp = msg2.msg_iov->iov_base;
      printf("RES %s \n", temp);    // I read empty string here. Why??

      handle_time(&msg2,2);
    }
}

【问题讨论】:

  • res = select(sock + 1, &readfs, 0, &errorfs, &delta); 检查返回值res。在你的情况下它可以是 {-1,0,1}

标签: c linux sockets


【解决方案1】:

好吧,看起来问题出在我想打印接收缓冲区的方式上,所以我没有在 printf 中使用 "%s" ,而是尝试了:

for(int i=0;i<100;i++)
    printf("%c", buffer2[i]);  

这为我揭示了缓冲区。缓冲区的开头有一些匿名数据导致了问题。
恐怕在这方面有文档或示例。

【讨论】:

    猜你喜欢
    • 2011-11-17
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    • 2012-04-12
    • 2012-01-26
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多