2017-02-09 91 views
0

我试图做根据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); 
    } 
} 
+0

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

回答

0

嗯,貌似问题是,我想打印出来的接收缓冲区的方式,所以不是在printf使用"%s",我想:

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

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