首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >可以读取延迟帧的套接字

可以读取延迟帧的套接字
EN

Stack Overflow用户
提问于 2019-10-10 16:09:42
回答 1查看 524关注 0票数 2

我使用的是CAN linux套接字,如下所示:

代码语言:javascript
运行
复制
    ...
    sockaddr_can addr;
    struct ifreq ifr;

    _sock_fd = socket(PF_CAN, SOCK_RAW, CAN_RAW);

    if (_sock_fd < 0) {
        throw(std::bad_exception());
    }

    strcpy(ifr.ifr_name, "can0");
    if (0 != ioctl(_sock_fd, SIOCGIFINDEX, &ifr)) {
        throw(std::bad_exception());
    }
    addr.can_family = AF_CAN;
    addr.can_ifindex = ifr.ifr_ifindex;

    fcntl(_sock_fd, F_SETFL, O_NONBLOCK);

    if (0 != bind(_sock_fd, (struct sockaddr*)&addr, sizeof(addr))) {
        throw(std::bad_exception());
    }
    ...

接下来,我使用常用的read函数从CAN网络读取帧:

代码语言:javascript
运行
复制
int CANSocket::CANRead(canid_t &id, vector<uint8_t> &data) {

    size_t size = 0;

    while (size < sizeof(struct can_frame)) {
        size += read(_sock_fd, &_msg, sizeof(struct can_frame));
    }

    id = _msg.can_id;

    data.clear();
    for (int i = 0; i < _msg.can_dlc; ++i) {
        data.push_back(_msg.data[i]);
    }

    return data.size();
}

我的问题是,当我调用我的CANRead函数时,它返回的帧大约是我通过candump实用程序获得的实际帧之前的100帧。

我在读取帧之间使用5ms睡眠,服务器每秒发送接近25帧的帧。

例如:当我通过candump实用程序列出读取的帧时,我会得到例如帧

代码语言:javascript
运行
复制
101
102
103
104
...
200

但我的程序在同一时间运行时会返回如下帧

代码语言:javascript
运行
复制
1
1
1
2
2
2
...
99

我在读取帧和套接字配置中有什么错误,所以它读取带有重复的延迟帧?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-15 21:45:39

该问题是由套接字读取缓冲引起的。将缓冲区大小设置为较小已解决的问题:

代码语言:javascript
运行
复制
    ...
    int bufsize = 128;
    if (0 != setsockopt(_sock_fd, SOL_SOCKET, SO_RCVBUF, &bufsize, sizeof(bufsize))) {
        throw(std::bad_exception());
    }
    ...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58318231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档