我试图根据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 :(得分:0)
好吧,看起来问题就是我想要打印出接收缓冲区的方式,所以我没有在"%s"
中使用printf
,而是尝试了:
for(int i=0;i<100;i++)
printf("%c", buffer2[i]);
这为我揭示了缓冲。在缓冲区的开头有一些匿名数据导致了这个问题 我害怕这个领域有文档或例子。