(C++로 작성) Linux 표준 함수를 사용하여 CAN 버스 소켓에서 I/O 작업을 수행하고 있습니다.CAN 버스 소켓을 강제로 플러시 할 수 있습니까?
소켓은 다음과 같은 개봉하여 사용 :
나중에 코드에/* 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를 사용해보십시오. 쓰기는 플래그가없는 send와 같습니다. – cup
[메일 링리스트] (http://vger.kernel.org/vger-lists.html#linux-can)를 사용하여 도움을 얻으십시오. –
write()가 성공했는지 확인하고 있습니까? 그것은 버퍼가 가득 차서'errno == ENOBUFS'가 될 수 있습니다. – yegorich