밀어서 잠금해제

Windows XBMC로 synology WebDAV에 접속 안되는 문제에 대한 고찰과 결과 본문

Tip

Windows XBMC로 synology WebDAV에 접속 안되는 문제에 대한 고찰과 결과

HAYAN_DEV! 2014.07.04 20:05

수정된 버전을 다운로드 하시려면 http://youtil.wo.tc/112 <- 이쪽으로.

결론부터 드리자면 해결했습니다.
원인 파악은 아직 제대로 되지 않았습니다. Windows용 curl library의 버그가 아닐까합니다.

여기서 재미있는 사실은 IP로 접속하면 신기하게도 WebDAV서버에 접속이 가능하다는 사실입니다!(뭐 이런 X같은!)


무슨 기업도 아니고 공인 기관도 아니고 일반 사용자가 돈 더 내고 고정 아이피를 사용해야하는 이유가 있겠습니까...
DDNS 켜놓고 도메인을 하나 파두는게 진리거늘...
아이피가 바뀔 때마다 도메인이 어디로 연결되나 확인하고 XBMC에서 IP를 바꿔줘야 한다니 귀찮기 짝이없는 일이라고 생각되었습니다.

그래서 소스코드를 받았습니다. XBMC는 오픈소스더군요.

으음... 조금 뒤적뒤적 거리다보니 WebDAV로 연결을 시도하는 부분을 어렵지 않게 찾을 수 있었습니다.
XBMC에서 WebDAV를 연결할 때 하는 작업 중 하나는 http 프로토콜에 접속을 시도해서 결과 값을 얻어오는 작업이더군요.
하지만 접속이 안되니까... 접속 시도할 때 쓰는 라이브러리가 curl 이길래 curl 버전을 올려보았습니다.

결과는 똑같더군요 ㄱ-; 대략 멘탈이 저 하늘로 날아가고 있는 중이었습니다.

코드를 뒤지다가 다음과 같은 주석을 발견했습니다.

// never verify peer, we don't have any certificates to do this
g_curlInterface.easy_setopt(h, CURLOPT_SSL_VERIFYPEER, 0);
g_curlInterface.easy_setopt(h, CURLOPT_SSL_VERIFYHOST, 0);

으음.. 좋습니다. SSL의 인증서 문제는 무조건 피해 갈 수 있군요. 아니 뭐 애초에 davs://아이피주소/ 로 연결 시도해서 되면 이미 끝난거지만.

자 그럼 저 같은 초보자가 curl library를 건들여봤자 좋은 꼴은 못볼거고 야매로 고쳐보도록 하죠.

여기서 부터는 개발쪽 분야를 지망하시고 C++을 배운지 마침 하루밖에 지나지 않은 어제 헬로 월드 띄우고 오오오 했던 분들을 위한 설명입니다.
위에서도 말했지만 방법이 너무 야메라 소스코드고 뭐고 올릴 맘이 없네요;

소스코드를 받습니다. Git에 있습니다. https://github.com/xbmc/xbmc <- 주소.
컴파일을 시도해봅니다. 어떻게 윈도우에서 컴파일 하나요? <- 를 참고하시기 바랍니다.

자 컴파일을 했으면 이제 몇가지 에러를 잡아보죠.
위 도큐멘트를 따라 진행하셨다면 아마 다음과 같은 오류가 나올 것 입니다.

AddonModuleXbmc*.cpp 를 찾을 수 없습니다.

 XBMC 프로젝트의 interfaces 필터 안에 swing 라는 필터가 있는데 이곳에 *.i 라는 파일이 있습니다.
마우스 오른쪽 클릭 후 컴파일을 눌러주세요. 만약 해결되지 않는다면 배치파일을 수정하셔야 하는데 경로 문제일 가능성이 높습니다.
tools/codegenerator/GenerateSWIGBindings.bat 파일을 편집기로 열어 수정해주세요.

자 컴파일이 완료되었으면 XBMC에서 URL을 관리하는 클래스를 찾아봅니다.
솔루션 프로젝트에서 URL을 검색해보니 URL.h 와 URL.cpp가 똭! 나오네요. 자 이 두 개 파일을 수정해 봅시다.

URL.h

class CURL
{
public:
	//중략
	void ChangeHostNameToIpAddress();
protected:
	//생략
}

URL.cpp

void CURL::ChangeHostNameToIpAddress()
{
	hostent* hostentPtr = nullptr;
	hostentPtr = gethostbyname(m_strHostName);

	if ( hostentPtr != nullptr )
	{
		m_strHostName.clear();
		m_strHostName.append(inet_ntoa(*(in_addr*)hostentPtr->h_addr));
	}
}

자 이제 CurlFile.cpp로 가봅시다.

CurlFile.cpp

bool CCurlFile::Open(const CURL& url)
{
	m_opened = true;
	m_seekable = true;

	CURL url2(url);
	// 추가
	url2.ChangeHostNameToIpAddress();
	//----
	ParseAndCorrectUrl(url2);

	std::string redactPath = CURL::GetRedacted(m_url);
	CLog::Log(LOGDEBUG, "CurlFile::Open(%p) %s", (void*)this, redactPath.c_str());

	ASSERT(!(!m_state->m_easyHandle ^ !m_state->m_multiHandle));
	if( m_state->m_easyHandle == NULL )
		g_curlInterface.easy_aquire(url2.GetProtocol(), url2.GetHostName(), &m_state->m_easyHandle, &m_state->m_multiHandle );
	// 중략..
	return true;
}


컴파일 및 실행 후 즐기시면 됩니다.



0 Comments
댓글쓰기 폼