2012-09-12 3 views
1

정기적 인 긴급 범위를 벗어나는 데이터를 수신 할 수있는 TCP 서버를 개발해야합니다. 나는 이것을 달성하기 위해 POCO C++ 라이브러리를 사용하고있다. StreamSocket 클래스의 (부족) 문서에서, 나는 이것이 달성하기 아주 쉬운 작업이 될 것을 참조 : 그렇게 같은) receiveBytes를 사용하는 경우합니다 (SO_OOBINLINE 플래그를 설정하여 방법을 수행해야합니다 :POCO C++을 사용하여 TCP 연결을 통해 OOB 데이터 보내기 및 수신

n = ss.receiveBytes(buffer, sizeof(buffer), SO_OOBINLINE); 

나는 OOB를 보낼 때

ss1.sendUrgent(0xFF); 

이를 테스트하기 위해, 나는 OOB 데이터를 전송하기 위해 "sendUrgent()"방법을 사용하는 매우 간단한 TCP 클라이언트 (또한 POCO 라이브러리를 사용하여) (1 바이트)했다 데이터, 아무 일도 일어나지 않습니다. 서버가이를 인식하지 못하는 것 같습니다.

반면에 sendBytes() 메서드를 사용하여 "normal"데이터를 보내면 SO_OOBINLINE 플래그가 StreamSocket에 설정된 경우 동일한 전송 된 데이터가 무한대로 수신됩니다. 아무도 그것을 재발송하지 않더라도).

무엇이 누락 되었습니까?

편집 : @ JimR의 제안과 this을 읽은 후, 나는 시도했다 :

n = ss.receiveBytes(buffer, sizeof(buffer), MSG_OOB); 

그리고 심지어이 :

n = ss.receiveBytes(buffer, sizeof(buffer), SO_OOBINLINE | MSG_OOB); 

는 모두 같은 예외를 발생 : 잘못된 인수를.

+0

'SO_OOBINLINE'은 일반 읽기에서 OOB 데이터를 반환하도록 소켓에 지시합니다. –

답변

1

난 당신이 변경해야 (이것은 오랜 시간이되었습니다) 생각

n = ss.receiveBytes(buffer, sizeof(buffer), SO_OOBINLINE);

n = ss.receiveBytes(buffer, sizeof(buffer), MSG_OOB);

편집 : 함께 위의 변경과 함께, 당신과 함께 setsockopt를 호출해야합니다 SO_OOBINLINE 플래그와 적절한 인수가 포함되어 있으므로 OOB 데이터는 별도의 채널이 아닌 일반 스트림에서 볼 수 있습니다. 귀하의 경우, 의견에 명시된 바와 같이 ss.setOOBInline(true);으로 전화하십시오.

SO_OOBINLINEsetsockopt과 함께 사용되는 소켓 옵션입니다.

MSG_OOBrecvsend 및 회사의 플래그입니다.

+0

답변 해 주셔서 감사합니다. 이 변경 작업을 수행하면 _receiveBytes_ 메서드가 "잘못된 인수"예외를 throw합니다. _ "소켓을 통해 긴급한 데이터 1 바이트를 보냅니다. "데이터가 MSG_OOB 플래그와 함께 전송됩니다. 소켓이 긴급 데이터를 수신하는 가장 좋은 방법은 SO_OOBINLINE 옵션을 활성화하는 것입니다 ". – pparescasellas

+0

@pparescasellas :'SO_OOBINLINE'이 선호된다고 동의하지만, ... POCO가 의미를 바꾸지 않는 한, 리눅스 소스의'SO_OOBINLINE'에 대한 유일한 언급은'setsockopt'와 회사와 그 정의에 대한 호출과 관련이 있습니다. 여기서 직접 볼 수 있습니다 : http://www.kneuro.net/cgi-bin/lxr/http/ident?a = sparc64; i = SO_OOBINLINE – JimR

+0

@pparescasellas : 뭔가 나에게 일어났습니다. MSG_OOB를 사용하기 전에 setsockopt를 사용하여 소켓에'SO_OOB_INLINE' 옵션을 추가 했습니까? 그렇지 않다면, 그 이유는 당신이 예외를 얻고있는 이유일지도 모른다. – JimR