【发布时间】:2016-07-02 16:34:42
【问题描述】:
我正在开发一个运行嵌入式 linux 的系统。我正在尝试从我在套接字上接收的流中获取数据包时间戳。
创建套接字后,我执行以下操作:
if (fd != -1) {
int enabled = 1;
setsockopt(fd, SOL_SOCKET, SO_TIMESTAMP, &enabled, sizeof(enabled);
}
绑定套接字之后,套接字的类型为 SOCK_STREAM。通过调用函数recv(fd, buf, size, 0),我成功地在套接字上接收到数据。现在为了获取接收数据的时间戳,我目前正在尝试以下操作:
ret = recv(fd, buf, size, 0);
if (ret > 0) {
struct timeval tv_ioctl;
tv_ioctl.tv_sec = 0;
tv_ioctl.tv_usec = 0;
int error = ioctl(fd, SO_TIMESTAMP, &tv_ioctl);
printf("%ld.%ld - error = %d", (long int)tv_ioctl.tv_sec,
(long int)tv_ioctl.tv_usec, error);
}
printf 语句的输出总是如下:
0.0 误差 = -1
error = -1 表示 ioctl 调用失败。我已经使用getsockopt 进行了测试,以检查是否设置了 SO_TIMESTAMP 选项,getsockopt 为选项 SO_TIMESTAMP 返回 0,因此它似乎设置正确。我在这里有点迷茫,我该如何进一步调查为什么 ioctl 调用似乎失败了?
【问题讨论】:
-
当您从系统调用中收到错误时,您应该打印
errno或strerror()或使用perror()为您执行此操作。正如您所发现的,-1 并不能告诉您任何有用的信息。
标签: c sockets embedded-linux