2014-02-18 2 views
1

(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을 사용하지 않고 소켓을 강제로 플러시합니까?

+0

MSG_NOWAIT 플래그가 설정된 sendto를 사용해보십시오. 쓰기는 플래그가없는 send와 같습니다. – cup

+1

[메일 링리스트] (http://vger.kernel.org/vger-lists.html#linux-can)를 사용하여 도움을 얻으십시오. –

+0

write()가 성공했는지 확인하고 있습니까? 그것은 버퍼가 가득 차서'errno == ENOBUFS'가 될 수 있습니다. – yegorich

답변

0

FFLUSH 또는 flushall를 사용하여 시도하고 도움이 볼 ...

아마 내 소프트웨어에서 해결 될 수있는 문제가 아니다, 그러나 그것은 시도 가치가있다.

+0

FStream이 필요하고 int가있는 경우 어떻게 fflush()를 사용할 수 있습니까? 심각한 문제를 일으키지 않고 소켓에서 스트림을 열 수 있다고 생각하지 않습니다 ... – LoneWanderer92

+0

어쩌면 약간의 도움이 될 수 있습니다. http://forums.codeguru.com/showthread.php?380878-How-to-run -a-very-long-SQL-statement – nishapatel

관련 문제