[MFC] WOL(wake on lan) 원격으로 컴퓨터 전원 켜기 구현해보기

WOL(wake on lan)은 컴퓨터가 특정 네트워크 데이터 패킷을 받으면 부팅이 되는 기능입니다.
그 특정 데이터 패킷을 매직 패킷이라고 하고, 컴퓨터는 윈도우를 종료하더라도 대기 전력을 사용하여 매직 패킷을 감지합니다.
매직 패킷에는 맥 주소가 일정한 규칙으로 입력되어 있는데 컴퓨터에서는 자신의 맥 주소를 비교하여, 같으면 부팅합니다.
매직 패킷의 첫 6 Bytes는 0xFF FF FF FF FF FF로 입력 되어 있고, 부팅을 하려는 컴퓨터의 맥 주소(6 Bytes)가 16번 반복된 총 102 Bytes로 구성 되어 있습니다.

패스워드가 있다면 맨뒤에 4~6자리 패스워드를 입력하여 108 Bytes로 만드시면 됩니다.

이 패킷을 UDP Broadcast, 포트 0, 7, 9 중 한곳에 보내면 됩니다.
자 이제 위 규칙을 토대로 매직 패킷을 직접 만들어 전송하는 프로그램을 만들어 보겠습니다.
그전에 아래 주의사항을 봐주세요. 안될 때 해결 방법은 구글에 WOL만 검색해도 엄청 많이 나옵니다.

  • 공유기와 바이오스에서 WOL 설정이 미리 적용되어 있어야 합니다.
  • 일반적으로 많은 LAN 카드가 WOL 기능을 지원하지만 설정항목에 없는 경우 드라이버 업데이트를 하시거나, 해당 기능이 있는 LAN 카드가 구성되어 있어야합니다.

프로젝트 하나 생성해서 아래와 같이 통신을 하기 위해, 그리고 안에 데이터를 넣을 수 있게 리소스를 입력해 줍니다.

소켓 여는 법은 넘어 가겠습니다. 전송 버튼을 클릭 이벤트 함수에 아래와 같이 코딩을 해줍니다.

void CWOLDlg::OnBnClickedButtonSend()
{
	UpdateData( TRUE );

	// 0xFF FF FF FF FF FF 입력
	byte abyMagicPacket[102] ={ 0x00, };
	byte abyFF[6] ={0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
	int iSize = 0;
	memcpy( &abyMagicPacket[iSize], abyFF, sizeof( abyFF ) );
	iSize += sizeof( abyFF );

	// MAC 주소 얻기
	byte abyMac[6] ={0x00, };
	for ( int iLoop = 0 ; iLoop < 6 ; iLoop++ )
	{
		abyMac[iLoop] = _tcstol( m_asMac[iLoop], NULL, 16 );
	}

	// 매직 패킷에 맥 주소 입력
	for( ; iSize < 102; iSize+=sizeof( abyMac ) )
	{
		memcpy( &abyMagicPacket[iSize], abyMac, sizeof( abyMac ) );
	}

	// 전송
	BYTE by0, by1, by2, by3;
	m_ctrlSendIP.GetAddress( by0, by1, by2, by3 );

	CString sIP;
	sIP.Format( _T( "%d.%d.%d.%d" ), by0, by1, by2, by3 );
	m_sockUdp.SendTo( abyMagicPacket, sizeof( abyMagicPacket ), m_uiSendPort, sIP );
}

타겟 아이피는 부팅할 IP를 입력해 주셔도 됩니다. 타겟 포트는 위에서 말한대로 0, 7, 9중 하나를 선택합니다.
전송 해서 확인을 하시면 실행 되는 것을 볼 수 있습니다.

제가 만든 프로그램 첨부합니다.