ASIO IP TCP iOStream 오류 감지를 향상시킵니다
-
22-07-2019 - |
문제
인사말. 나는 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 만 확인할 수도 있습니다.