2009-09-25 4 views
2

클라이언트 수신자가로드에 대처할 수없는 경우 busy UNIX 도메인 소켓 (AF_UNIX 유형)을 통해 데이터를 푸시 할 수 있습니까?UNIX 도메인 소켓 : "사용 중"신호가 있습니까?

또는

는 흐름 제어를 처리 할 수있는 소켓의 상단에 클라이언트 - 서버 프로토콜이 있어야합니다?

답변

0

프로토콜에이 정보를 포함시키지 않으면 서버가 정보 전송을 일시 중지하도록 클라이언트에 알릴 방법이 없습니다.

+0

그래서 실제로 소켓은 흐름 제어가없는 FIFO입니다. 필요한 경우 흐름 제어에 상위 계층 프로토콜이 필요합니다. – jldupont

+0

TCP/IP는 너무 많이 알지 못합니다. 제어 메시지에 대한 핸들러를 작성하는 것도이 작업을 수행하는 유일한 방법입니다. – Alex

+2

@ Jean-Lou : 맞습니다. 'AF_UNIX'는 절대적으로 흐름 제어 의미를 제공하지 않습니다. 기본 디바이스는'send()'가 에러를 리턴하지만 디바이스마다 다르다는 버퍼 오버 플로우 조건을 제공 할 수 있습니다. –

-2

'사용 중이며'특정 신호를 다시 보내는 서버 (예 : HTTP의 503 서비스를 사용할 수 없음)가 아닌 서버. 특정 시간이 지난 후 클라이언트 측 연결 시간 초과를 설정하고 시간 초과 이벤트가 발생하면 서버가 사용 중일 때이를 해석 할 수 있습니다.

+0

...이 동작은 일반적으로 소켓에 일반적입니다 * 또는 * AF_INET 관련? (나는 HTTP를 사용하는 당신의 예제 때문에 묻고있다) – jldupont

+0

PS ETIMEDOUT은 주어진 타임 아웃 시간 내에 연결을 만들 수 없다면 소켓 'connect'호출에서 얻은 것이다. setsockopt SO_SNDTIMEO는 시간을 설정하여 (기본값을 원하지 않는다면) 설정하는 방법입니다. – AlBlue

+1

그런 다음 다시 호스트가 실제로 작동 중지되었을 수 있습니다. 당신의 고객이 이런 종류의 상태에 있도록하는 것은 프로세스를 모니터링하는 사람들에게 매우 오도하는 것입니다. (미션 크리티컬 임) – Alex

8

확실히 차단 도메인 컨트롤러에 보낼 수 있습니다. 수신 측의 수신 버퍼가 가득 차거나 처리되지 않은 (전송되지 않은) 송신 소켓 버퍼 수가 너무 높으면 송신자가 차단됩니다.

SOCK_STREAM UNIX 도메인 소켓은 TCP 소켓처럼 작동합니다. SOCK_DGRAM UNIX 도메인 소켓은 UDP와 유사하게 작동합니다. 단, UNIX 도메인 데이터 그램은 순서대로 전달되는 것을 보장하지만 UDP 소켓은 순서를 변경하거나 삭제할 수 있습니다. 또한 UNIX 도메인 소켓을 사용하여 파일 설명자를 보내고 프로세스간에 사용자 자격 증명을 전달할 수 있습니다.이 중 어느 것도 TCP, UDP 또는 파이프로 수행 할 수 없습니다.

따라서 주문형 전달은 모두 유닉스 도메인 소켓의 유형을 사용하면 수신자는 다른 작업을 수행 중일 때 수신을 중지 할 수 있으며 사용 가능한 버퍼 공간이 더 이상 없을 때는 발신자가 자동으로 차단됩니다 (그렇지 않은 경우 버퍼 공간이 더 이상 없다고 통보됩니다). 블로킹 동작). 그런 다음 수신자가 다시 수신을 시작하면 발신자는 더 보낼 수 있습니다.

+0

XON/XOFF를 사용할 수있는 방법이 있습니까? – CMCDragonkai

+0

상단에서 원하는 모든 프로토콜을 사용할 수 있으며 XON/XOFF 문자 전송을 포함 할 수 있습니다. 그러나 커널은 당신을 위해 특별한 일을하지 않을 것입니다. 다른 바이트와 마찬가지로 통과시킵니다. – jtchitty

관련 문제