2013-10-02 4 views
1

Windows 및 Linux에서 실행중인 소프트웨어를 얻으려면 소켓 레이어를 다시 작성해야했습니다. Windows에서 select에서 WSAPoll로 변경하고 표준 이벤트를 포함하기 전에 WSAWaitForMultipleEvents를 사용하여 필요한 경우 제한 시간 전에 작업을 취소합니다. 1024 개 이상의 소켓을 처리해야하므로 select에서 Linux로 폴링으로 변경해야합니다. 리눅스에서 설문 조사 대기를 취소 할 수있는 방법이 있습니까? remoe 연결을 추가해야하는데 폴링 대기 시간 초과로 인해 속도가 느려집니다.소켓 폴링 작업 취소

+0

사이드 노트에'boost :: asio'는 충분하지가 않습니까? – Nim

+0

@ 님 : 여러 이유로 인해 프로젝트에서 boost를 사용하지 않았습니다. 여기에만 2 개. 공식 문서는 농담입니다. 중요한 행동은 설명하지 않습니다. boost :: asio에는 알려진 버그가 있습니다. 호스트 포트가 열려 있지 않으면 (호스트가 거부 됨) 올바른 연결 소켓과 구별 할 기회가 없으면 연결 및 즉시 닫기 이벤트가 트리거됩니다. 나는 C++ 11로 옮겨 갔고, 특히 boost :: asio 전체를 뒤로 돌렸다. –

답변

2

pipe()을 사용하여 의사 내부 이벤트를 생성하고 이쪽의 판독면을 poll() 목록에 추가하여 첫 번째 이벤트로 만듭니다.

폴링을 취소하려면 파이프에 문자를 쓰고 poll()이 반환됩니다. 012와 같이 내부 이벤트 일 것입니다.

다른 값을 파이프로 전달하여 조잡한 메시징 시스템으로 만들 수도 있습니다.

수동 이벤트를 사용하여 Windows 코드에서 이와 동일한 작업을 수행 할 수 있습니다.

그냥 이것을하는 IoEvent 클래스를 참조하십시오.

+0

나는 이것을 읽는 것이 가장 좋은 방법이라고 믿을 수 없다. 큰 "이벤트"버퍼에서 실행되는 것을 피하기 위해 파이프에서 값을 읽으려고합니다. 손에 샘플이나 링크가 있습니까? –

+0

@MartinSchlott이 방법으로는 전혀 문제가 없었으며, 우아하고 시스템 호출을 강제로 멈추지 않는다고 생각합니다. 또한'poll()'이 시작되기 전에 이벤트를 설정할 수 있음을 의미한다. 위에 링크 된 코드는 다양한 예제를 제공해야하지만 개념을 너무 많이 추상화 할 수있는'IoEvent' 및'IoEventWaiter' 클래스를 사용합니다. – trojanfoe

+0

어, 먼저 게시물의 마지막 줄을 읽었습니다. 링크 Thx! –