【发布时间】:2014-02-18 09:52:30
【问题描述】:
在我的软件(用 C++ 编写)中,我使用 Linux 标准函数在 CAN 总线套接字上打开并执行 I/O 操作。
socket被打开并使用如下:
/* Create the socket */
if ((skt = socket( PF_CAN, SOCK_RAW, CAN_RAW )) < 0)
{
...
}
struct ifreq ifr;
strcpy(ifr.ifr_name, "can0");
ioctl(skt, SIOCGIFINDEX, &ifr);
struct sockaddr_can addr;
addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;
ifr.ifr_ifru.ifru_ivalue = 1000000/2;
ioctl(skt, SIOCSCANBAUDRATE, &ifr);
if(bind( skt, (struct sockaddr*)&addr, sizeof(addr) ) < 0)
{
...
}
后面的代码...
write(skt, &msg, sizeof(struct can_frame));
但是我注意到有时我刚刚写在套接字上的消息不会通过总线发送。 我认为它就像一个缓冲区,有时需要显式刷新(比如同时有很多消息等)。 我在网上搜索过,但没有发现任何适合我的情况(很多人建议使用 fflush(),但我只有文件描述符声明为 int),所以问题是:有一种方法可以在不使用 FSTREAM 的情况下强制刷新套接字?
也许不是可以通过我的软件解决的问题,但值得一试...
【问题讨论】:
-
尝试使用将标志设置为 MSG_NOWAIT 的 sendto。写入与不带标志的发送相同。
-
使用mailing list 寻求帮助。
-
您是否在检查 write() 是否成功?可能是缓冲区已满,您会收到
errno == ENOBUFS。 -
@cup 使用 send() 并且该标志不起作用,问题仍然存在。
-
@cup 同样的事情......现在我要更好地检查 errno 状态。我尝试在写入 16 can_frame 后添加 100 毫秒的简单睡眠,问题似乎解决了