2016-09-21 6 views
0

비 차단 방식으로 클라이언트 소켓을 사용할 수 있습니까? 내가 서버에 내가 그 소켓에 재귀 recv을 할 것을 연결하는 클라이언트 소켓을 작성하는 경우, 데이터 전송 및 연결이에 의해 폐쇄되지 않은 경우없는 경우OCaml 비 차단 클라이언트 소켓

는 예를 들어, Unix.recv의 마지막 호출이 차단됩니다 서버.

  • socket() 및 소켓 유형 MSG_DONTWAIT 플래그
  • 또는 receiv()와 OR 연산 SOCK_NONBLOCK 플래그를 사용 :

    C에서, 당신은 모두 플래그를 지정할 수 있습니다.

여기 보았다 :

하지만 여기에 대한 정보를 찾을 수 없습니다.

+0

'recv() recv()''는 아무런 의미가 없습니다. – EJP

+0

예, 맞습니다. 죄송합니다. 모든 데이터가 읽힐 때까지 재귀 함수에서'recv'를 호출 할 때 말하고 싶었습니다. 어쩌면 모든 데이터를 읽을 때까지'recv'를 여러 번 호출해야합니다. – cedlemo

+1

Lwt (http://ocsigen.org/lwt/2.5.2/manual/)를 보셨습니까? 그것은 비 블로킹 작업을위한 많은 도구를 제공합니다. 예를 들어,'Lwt_unix.recv' (http://ocsigen.org/lwt/2.5.2/api/Lwt_unix#VALrecv)는'Unix.recv'와 같은 non-blocking 기능을합니다. – hcarty

답변

1

Unix.set_nonblockUnix.clear_nonblock을 사용하십시오.

+0

아마도 유닉스 오류 EINPROGRESS와 EAGAIN을 다뤄야 할 것입니다. 코드 예제에 대한 링크가있을 수 있습니까? – cedlemo

+1

http://pleac.sourceforge.net/pleac_ocaml/sockets.html –