문제

인사말. 나는 Boost :: Asio 라이브러리를 시작하고 Boost :: asio :: ip :: tcp :: iostream과 관련된 초기 어려움을 겪었습니다.

내 질문에는 두 부분이 있습니다.

1.) 간단한 호스트와 포트 번호를 사용하여 ioStream을 어떻게 연결합니까?

나는 만들 수있다 고객 그리고 섬기는 사람 boost.org] 예제는 코딩 된대로 잘 작동합니다. 서버는 포트를 명시 적으로 지정합니다.

boost::asio::io_service io_service;

tcp::endpoint endpoint(tcp::v4(), 13);
tcp::acceptor acceptor(io_service, endpoint);

포트 13은 "주간"서비스를위한 잘 알려진 포트입니다.

클라이언트 예제는 호스트와 서비스 이름을 지정하여 연결합니다.

tcp::iostream s(argv[1], "daytime");

내 응용 프로그램의 경우 서버를 임의의 포트에 놓고 아래와 같이 숫자별로 연결하고 싶습니다.

섬기는 사람:

boost::asio::io_service io_service;
tcp::endpoint endpoint(tcp::v4(), port);
tcp::acceptor acceptor(io_service, endpoint);
acceptor.accept(*this->socketStream.rdbuf());
...

고객:

boost::asio::ip::tcp::iostream sockStream;
...
sockStream.connect("localhost", port);
...

클라이언트에서 포트 번호를 직접 지정하려고하면 (이름으로 서비스 대신) 스트림이 연결되지 않습니다. 이것을 할 방법이 있습니까? 연결 논쟁이 무엇인지/해야 할 것은 명확하지 않습니다.


2.) ioStream :: Connect에 대한 호출의 성공을 테스트하는 선호하는 방법은 무엇입니까?

함수는 무효를 반환하며 예외는 발생하지 않습니다. 지금까지 고안 한 유일한 방법은 stream.fail () 및/또는 stream.good ()를 테스트하는 것입니다. 이것이 그렇게하는 방법입니까, 아니면 다른 방법이 있습니까?


이 중 하나 또는 둘 다에 대한 조언은 감사 할 것입니다. 또한, 관련 문서 및/또는 예제를 간과하고 있다면 좋을 것입니다. 지금까지 나는 도서관 문서를 읽거나 'Net'을 검색하여 이러한 질문에 대답 할 수 없었습니다.

도움이 되었습니까?

해결책

ASIO가 왜 작동하지 않는지 (적어도 부스트 1.35.0에서) int로 표현 된 포트 번호로 작동하지 않습니다. 그러나 포트 번호를 문자열로 지정할 수 있습니다. 즉

tcp::iostream s(hostname, "13");

작동해야합니다.

오류 감지와 관련하여 :

tcp::socket Endpoint를 취하고 Endpoint를 취하는 Connect () 메소드와에 대한 참조가 있습니다. boost::system::error_code 성공적으로 연결되어 있는지 알려주는 객체.

다른 팁

오류가 반환되지 않더라도 Stream.Error ()에는 최신 오류 코드가 포함되어 있습니다. 코드를 사용했습니다

do
{
    m_stream.clear();
    m_stream.connect(host, port);
}
while(m_stream.error());`

특정 오류 부스트 :: asio :: error :: connection_refused 만 확인할 수도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top