부스트 :: asio :: ip :: tcp :: Resolver :: Resolve () 블록 영원히
-
21-08-2019 - |
문제
나는 비슷한 것을 만들려고 노력하고 있습니다 이 코드 boost.asio 예제에서 발견됩니다.
socket.h :
class some_class {
private:
...
boost::asio::io_service io_service;
public:
some_class() {
/* This stuff isn't used in the example...
...but it doesn't change anything... */
io_service.run();
}
};
socket.cpp :
using boost::asio::ip::tcp;
bool some_class::connect(char* host, char* port)
{
printf("Resolving hostname...\n");
/* Resolve hostname. */
tcp::resolver resolver(io_service);
tcp::resolver::query query(tcp::v4(), host, port);
tcp::resolver::iterator iterator = resolver.resolve(query);
printf("Connecting to %s:%s... ", host, port);
/* Connect to resolved hosts. */
sock->connect(*iterator);
return true;
}
g ++는 오류없이이를 구축하지만 코드는 리졸버.resolve () 호출을 지나치지 않습니다.
호스트의 경우 "127.0.0.1"과 "LocalHost", 포트의 경우 "80"을 모두 시도했습니다. (중요하다고 생각하지 않지만 Apache2가 시작되고 실행 중입니다)
응용 프로그램에서 Ctrl+C를 CTRL+C로 만들면 분명히 종료되지만 바로 직전에 "문자열에 연결"을 출력합니다.
나는 예제를 직접 구축하고 같은 문제가 발생하는지 확인할 계획이며 여기에 결과를 확실히 게시 할 것입니다. 이 문제를 겪은 사람이 있거나이 행동을 일으킬 수있는 원인을 알고 있습니까?
편집하다:
이 예제는 잘 실행됩니다 ... 디버깅이 있습니다.
두 번째 편집 :
나는 그것을 얻지 못합니다. 다른 것은 다른 일은 호스트/포트입니다.
예제는 char* argv []를 사용하고 있습니다.
char host[] = "localhost";
char port[] = "80";
세 번째 편집 :
실제로 Connect에서 차단하는 것 같습니다. fflush (stdout)를 잊어 버렸습니다. 그런 다음 소켓에 문제가 있어야합니다. 더 많은 테스트를 할 것입니다.
네 번째 편집 :
멍청 해요, 전혀 막지 못했습니다! 콘솔 출력에 너무 의존하고있었습니다 ..
해결책
printf 이후 연결 호출이 차단 될 것입니다.
stdout은 기본적으로 라인 버퍼링되어 있으며 Printf 문자열의 끝에 a n이 없으므로 출력이 표시되지 않습니다. 프로그램을 죽일 때 버퍼가 플러시되고 있으므로 메시지가 표시됩니다.