2016-10-18 3 views
0

UNIX 도메인 소켓 (AF_UNIX 타입 & DGRAM)에서, 리더가 느릴 때, no. 대기열에있는 패킷 수는 'max_dgram_qlen'입니다. 큐에 대기중인 바이트를 식별 할 수있는 방법이 있습니까? 송신자 또는 수신자 측의 대기열에서 더 많은 바이트가 제거됩니다. 또는 적어도 대기열이 가득 차면 작성기가 차단됩니다. 작가 블록 이벤트를 식별하는 방법이 있습니까? 미리 감사드립니다. 유닉스 도메인 소켓 큐 세부 사항

+1

fyi ... AF_INET + SOCK_DGRAM은 Unix 도메인 소켓이 아니며 UDP를 사용하는 TCP/IP 소켓입니다. – selbie

+0

가능한 복제본 : http://stackoverflow.com/questions/16427842/how-many-packets-or-bytes-are-in-the-socket-receive-queue. 하지만 얼마나 많은 바이트가 보낸 사람쪽에 대기 중인지 묻는 것. – selbie

+0

질문을 편집했습니다. 귀하의 제안에 감사드립니다. –

답변

0
  1. ioctl을 사용하여 알아낼 수 있습니다.

는 빈 (가정 당신이 이미 데이터를 입력하고 그들이 소비되었는지 확인 할) 경우 쓰기 버퍼를 확인하려면 :

FD 소켓의 파일 기술자 및 변수 보류입니다
ioctl(fd, SIOCOUTQ, &pending); 

남은 데이터 크기가 반환됩니다. 비어 (가정 누군가가 이미 데이터를 입력하고 당신이 그들을 사용하지 않고 그들이 어떤 존재 여부를 확인 할) 경우

읽기 버퍼를 확인하려면

ioctl(fd, SIOCINQ, &pending); 
/*note the difference on the second parameter, where we change the flag from SIOCOUTQ to SIOCINQ*/ 
  1. send() 함수가 반환 한 오류 메시지를 기반으로 버퍼 가득 참 이벤트를 확인할 수 있습니다. 오류 == ENOBUFS을 확인하면 버퍼가 가득 찼음을 확인할 수 있습니다.
+0

2 잘못되었습니다. 소켓 버퍼가 아니라 장치 버퍼를 참조합니다. "ENOBUFS : 네트워크 인터페이스의 출력 대기열이 가득 찼습니다. 일반적으로 인터페이스가 전송을 중지했지만 일시적 정체로 인한 일 수 있습니다 (일반적으로 Linux에서는 발생하지 않습니다. 패킷은 장치 대기열 이 오버플로됩니다.) " – sourcejedi

1

파일 설명자를 비 블로킹으로 설정하고 select을 사용하여 현재 시간에 기록 할 수 있는지를 결정해야합니다.