Win32 WinInet의 InternetOpenUrl 사용시 blocking이 된다면

 현재 서비스중인 MMORPG의 런처가 Win32API로 되어있고 WinInet을 사용해서 http등을 접근해서 패치등을 처리하고 있습니다. 보통은 이걸 많이들? 사용하게되죠.


PARM* pThreadParm = (PARM*)vThreadParm;

pThreadParm->pURL = 0;
if( pThreadParm->_openURL == false )
{
if( !( pThreadParm->pURL = InternetConnect( pThreadParm->pInternet, pThreadParm->pHost, pThreadParm->pPort, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0 ) ) )
{
swprintf( pThreadParm->errText, L"Internet Connect Failed. Error code(%d)", GetLastError() );
return 1;
}
}
else
{
if( !( pThreadParm->pURL = ::InternetOpenUrl( pThreadParm->pInternet, pThreadParm->pHost, NULL, 0, INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE, 0 ) ) )
{
swprintf( pThreadParm->errText, L"Internet open url Failed. Error code(%d)", GetLastError() );
return 2;
}
}


 문제가 된 부분은 위와 같습니다. bold 처리한 InternetOpenUrl 부분인데요. 몇년간 이상이 없다가 갑짜기 런처를 업데이트 하면서 먹통이 되더군요. 제가 작업했던 건 아니라 무슨 작업을 하다가 생긴 문제였는지 몰랐는데 알고 봤더니 런처에 띄우는 배너를 하나더 추가하면서 생긴 문제였는데요,

 WinInet은 한 서버에 대한 동시 접근 커넥션 수를 HTTP1.0(4개)과 HTTP1.1(2개) 규약에 맞게 제한한다고 합니다. 스샷에 붉은색으로 표시한 것이 웹에 접근해서 정보를 얻어오는 녀석들입니다. 총 4개죠? 근데 눈에 안보이는 채널정보를 얻어오는 녀석이 있습니다. 5개가 됩니다. 그래서 런처에 먹통이 되는 블럭이 발생했었죠.

 해결을 하려면 InternetQueryOption과 InternetSetOption에 각각 INTERNET_OPTION_MAX_CONNSPER_SERVER, _MAX_CONNS_PER_1_0_SERVER 옵션을 사용해서 제한 수를 설정할 수 있습니다.


DWORD dwData = 0;
DWORD dwSize = sizeof(dwData);
InternetQueryOption(NULL, INTERNET_OPTION_MAX_CONNS_PER_SERVER, &dwData, &dwSize);

dwData = 10;
InternetSetOption(NULL, INTERNET_OPTION_MAX_CONNS_PER_SERVER, &dwData, sizeof(dwData));

InternetQueryOption(NULL, INTERNET_OPTION_MAX_CONNS_PER_1_0_SERVER, &dwData, &dwSize);

dwData = 10;
InternetSetOption(NULL, INTERNET_OPTION_MAX_CONNS_PER_1_0_SERVER, &dwData, sizeof(dwData));

 이렇게 하시면 제한이 10개로 되면서 문제 없게됩니다.

참고 : WinInet이 서버당 연결 수를 제한한다. 

댓글

이 블로그의 인기 게시물

'xxx.exe' 프로그램을 시작할 수 없습니다. 지정된 파일을 찾을 수 없습니다.

goorm IDE에서 node.js 프로젝트로 Hello World Simple Server 만들어 띄워보기

애드센스 수익을 웨스턴 유니온으로 수표대신 현금으로 지급 받아보자.