반응형

VC++로 빌드된 프로그램을 실행할 경우 *.dll파일이 없다면서 경고가 발생할 수 잇다.


그럴때는 아래 링크들을 참고하여 해당 운영체제별(64비트,32비트)로 다운로드 하여 설치하면 된다.



Visual Studio 2015용 Visual C++ 재배포 가능 패키지

http://www.microsoft.com/ko-kr/download/details.aspx?id=48145



Visual Studio 2013용 Visual C++ 재배포 가능 패키지

http://www.microsoft.com/ko-kr/download/details.aspx?id=40784



Microsoft Visual C++ 2010 Service Pack 1 재배포 가능 패키지

http://www.microsoft.com/ko-KR/download/details.aspx?id=26999



Microsoft Visual C++ 2008 Service Pack 1 재배포 가능 패키지

http://www.microsoft.com/ko-KR/download/details.aspx?id=26368



Microsoft Visual C++ 2005 Service Pack 1 재배포 가능 패키지

http://www.microsoft.com/ko-KR/download/details.aspx?id=26347


반응형

출처 : http://codens.info/678

쓰레드 생성

- AfxBeginThread 권장 

- CWinThread::m_bAutoDelete 

- 기본은 TRUE, 자동으로 개체(핸들포함)가 삭제됨 <- 권장

- FALSE로 설정하려면 CREATE_SUSPENED 로 시작해서 설정후 ResumeThread()해줘야함

- 해제시 핸들을 닫으면 안되고 CWinThread개체를 delete 해야 함


- AfxEndThread()는 강제 종료 함수로 권장 안함


- CreateThread() 권장 안함



* 쓰레드 종료 대기

    - WaitForSingleObject 사용 권장


    - GetExitCodeThread 는 bAutoDelete = TRUE시 문제 있음, 

- CreateThread()때만 사용, 하지만 권장 안함



//=======================================
//AfxBeginThread

//시작
CWinThread * CSimpleTestDlg::MFC_TrdStart( bool _bAutoDel)
{
    char *str = "MFC_TrdStart"; g_pstr[0]=str;m_pstr[0] = str;
    //쓰레드 생성
    m_bStop=false;
    CWinThread *pWThd=0;
    //
    if( _bAutoDel == false){
        _DbgStr(_T("MFC_TrdStart- 자동삭제=false"));
        //값을 바꾸기위해서는 멈춤->설정->시작
        pWThd = AfxBeginThread( MFC_TrdFunc, this, 0, 0, CREATE_SUSPENDED  );//멈춤    
        pWThd->m_bAutoDelete = FALSE; //기본값은 TRUE, 설정
        pWThd->ResumeThread();//시작
    }else{
        _DbgStr(_T("MFC_TrdStart- 자동삭제=true"));
        pWThd = AfxBeginThread( MFC_TrdFunc, this, 0, 0, 0  );//<- 권장
    }

    if( !pWThd )
        return 0;

    m_hThread = pWThd->m_hThread;
    
    _DbgStr(_T("MFC_TrdStart- 끝=%X"), m_hThread);
    return pWThd;
}

//쓰레드 트리거 함수
UINT __cdecl CSimpleTestDlg::MFC_TrdFunc( LPVOID pParam )
{
    char *str = "MFC_TrdFunc";g_pstr[1]=str;
    CSimpleTestDlg *pClass = (CSimpleTestDlg *)pParam;
    pClass->MFC_TrdProc();
    _DbgStr(_T("쓰레드 종료 MFC_TrdFunc"));//MFC_TrdProc()에 AfxEndThread()가 있으면 여기까지 실행이 안됨
    return 1;
}

//실제 쓰레드 동작
int CSimpleTestDlg::MFC_TrdProc()
{
    char *str = "MFC_TrdProc";g_pstr[2]=str; m_pstr[2] = str;
    while(1)
    {
        if( m_bStop ){
            _DbgStr(_T("쓰레드 종료신호 MFC_TrdProc"));
            break;
        }

        Sleep(1000);
        _DbgStr(_T("쓰레드 실행중 MFC_TrdProc"));
    }

    _DbgStr(_T("쓰레드 종료 MFC_TrdProc-1-%d"), (UINT)GetTime() );
    //AfxEndThread(0);//쓰레드가 강제 종료됨, 사용하면 안됨 TerminateThread()와 같음
    _DbgStr(_T("쓰레드 종료 MFC_TrdProc-2-%d"), (UINT)GetTime() );//
    
    return 1;
}


//===============================================
//쓰레드 종료를 기다린다
//WaitForSingleObject 사용 권장


// CreadThread()로 시작한 쓰레드만 대기, AfxBeginThread() 로 시작한 쓰레드는 사용하면 안됨
int WaitThreadEndH(HANDLE _hThread, int _nWaitMilSec ,  LPCTSTR _sMsg, bool _bClose)
{
    if( !_hThread ) return 0;
    _DbgStr(_T("WaitThreadEnd-시작-%s-%X-%d"),_sMsg, _hThread, GetTickCount() );
    //bFinishThread == TRUE; // 종료를 위한 변수설정 후 3초간 대기
    
    DWORD dwExit=0;
    DWORD dwRetCode = WaitForSingleObject(_hThread, _nWaitMilSec);
    if(dwRetCode == WAIT_OBJECT_0) // 정상종료
    {
        _DbgStr(_T("WaitThreadEnd-정상 종료-%s-%X-%d"),_sMsg, _hThread, GetTickCount() );
    }
    else if(dwRetCode == WAIT_TIMEOUT) // 타임아웃
    {
        //::TerminateThread(_hThread, 0 );
        _DbgStr(_T("WaitThreadEnd-강제종료-%s-%X-%d"),_sMsg, _hThread, GetTickCount() );
    }    

    if( _bClose){  
        //AfxBeginThread()로 생성된 쓰레드는 핸들을 닫으면 안된다. CWinThread를 delete 해야한다.
        //m_bAutoDelete == TRUE 일때는 호출하면 안된다
        CloseHandle( _hThread );
    }

    _DbgStr(_T("WaitThreadEnd-끝-%s-%X-%d"),_sMsg, _hThread, GetTickCount() );
    return 1;
}


//AfxBeginThread() 로 시작한 쓰레드는 이함수로 종료해야 함
int WaitThreadEndW(CWinThread *_pWinThread, int _nWaitMilSec, LPCTSTR _sMsg)
{
    if( !_pWinThread ) return 0;
    HANDLE _hThread = _pWinThread->m_hThread;
    _DbgStr(_T("WaitThreadEnd(W)-시작-%s-%X-%d"),_sMsg, _hThread, GetTickCount() );
    //bFinishThread == TRUE; // 종료를 위한 변수설정 후 3초간 대기
    bool bAutoDel = _pWinThread->m_bAutoDelete;
    DWORD dwExit=0;
    DWORD dwRetCode = WaitThreadEndH( _pWinThread->m_hThread, _nWaitMilSec, _sMsg, false  );//핸들을 닫으면 안된다.
    
    //m_bAutoDelete = FALSE의 경우 스레드의 삭제
    if(bAutoDel==false)
    {
        GetExitCodeThread(_pWinThread->m_hThread, &dwExit);
        _DbgStr(_T("WaitThreadEnd(W)-쓰레드 클래스 삭제(code=%d)", dwExit));
        
        //if( _bClose) CloseHandle( _hThread );//하면 안됨클래스 해제시 자동 해제 된다.
        
        delete _pWinThread;  
    }    

    _DbgStr(_T("WaitThreadEnd(W)-끝-%s-%X-%d"),_sMsg, _hThread, GetTickCount() );
    return 1;
}
//===================================================================


반응형




프로젝트 설정 > 구성 속성 > C/C++ > 미리 컴파일된 헤더 > 미리 컴파일된 헤더


에서 미리 컴파일된 헤더를 사용 안함으로 설정

반응형

원래 c와 c++은 string이라는 똑똑한 자료구조형을 compiler차원에서 지원하고 있지 않습니다.


그대신 가장 많이 사용하는 string을 어떻게 저장해야 할지에 대해 고심한 결과...

결국 배열의 끝에 '\0'또는 0 또는 NULL값을 넣어 string을 표현하도록 했습니다.

결국 가장 적은 용량의 string처리와 가장 골치아픈 string처리가 탄생하는 순간이였죠.


어쨌거나 요점은...

Windows에서는 이런 string처리를 위해서 char* 형을 그대로 쓰기 보다는 LPCSTR등의 표현으로 

대치해 사용함으로써, 개발의 편의성을 돕고 있습니다.


* LPSTR, LPCSTR

LP는 long pointer를 나타내는 약어로서 16bit시절의 윈도우의 유산입니다.

과거 windows3.1까지의 시절에는 포인터는 모두 16bit였고, 24bit 메모리를 long pointer라는 것을 통해서 

extended memory라는 이름으로 관리했었거든요..

현재 LP(long pointer)는 .Net에서는 64bit pointer를, VC++6.0과 그 이전 버전에서는 32bit pointer를 나타냅니다.


C는 constant, 즉 함수의 내부에서 인자값을 변경하지 말라는 뜻입니다.


STR은 내부적으로는 char형 배열에 null값 종료를 의미하고 있죠.


LPSTR = long pointer string = char *

LPCSTR = long pointer constant string = const char *

결과적으로는 맨 마지막과 같은 형이라는 거죠.




* LPWSTR, LPCWSTR

W 이넘은 wide char를 나타냅니다. 쉽게 말하면 unicode죠..

한글 조합형 코드도 아니고...unicode를 나타냅니다.


LPWSTR = long pointer wide string = w_char *

LPCWSTR = long pointer constant wide string = const w_char *


//이하 미정리

* LPCTSTR

LPCTSTR = long pointer constant t_string = const tchar *

- t_char('티캐릭터'라고 읽습니다.)


마이크로소프트가 세계 각국에 제품을 판매하면서..각국의 언어에 맞추어 개발하는 것에 환멸을 느끼다가..

드디어 windows를 unicode기반으로 개발하는 작업에 착수했습니다.


그런데... 문제는 char는 1Byte이고 wide char는 2Byte이므로..포인터 연산을 많이하는 c, c++코드는 호환성에 치명적인 문제가 있었죠. 그래서 컴파일러가 precompile option을 보고. 환경에 맞게 동작하는 코드를 작성할 수 있는 새로운 변수 모양의 Macro를 선언하게 되었습니다.

그것이 바로 TCHAR, t_char라는 변수죠.

이놈들은 자신의 운영체제가 

multi-byte환경이면, char형으로, unicode환경이면, w_char, wide char형으로 type casting됩니다.


그래서... 보통 windows 9x, 2000계열의 환경이라면,

LPTSTR = LPSTR = char *

LPCTSTR = LPCSTR = const char *가 됩니다.


그런데..

아마 저 코드에서..

(LPSTR)(LPCTSTR) 형변환을 할때 자세히 보면..

const 라는 키워드만 떼내는거지요...

그러니까 사실은 (char *)(const char *)와 같은 말입니다.

웃기는 형변환이죠..

그럼 없어도 될까요?^^


없으면 당연히 오류가 나게됩니다.

왜냐면...(LPSTR)CString을 하면.... CString형 자료의 맨 처음 주소부터 char * 형으로 형변환하기 때문이죠.

CString형은 앞의 16Byte를 자료형을 표현하기 위해서 사용하기 때문에, 여기서부터 형 변환을 해주면 엉뚱한 값이 표현되게 됩니다.


따라서 MFC에서 지원하는 CString class는 LPCTSTR라는 함수를 통해서 일단 안전하게 const char * 형으로 바뀐 자료형을 얻어오게 하는거죠.


CString myString;

(LPCTSTR)myString;이라고 해주면..

myString내부의 string 값을 꺼내오게 도와주는 연산자 또는 함수를 사용하게 된겁니다.

즉 (LPCTSTR)이란 놈이 반환값이 const char* 인 함수입니다.

정확하게 표현하면 operator overloading이라는 거지요.


결과적으로 (LPSTR)(LPCTSTR)myString은

myString의 내부 string 자료를 함수를 통해 자료를 꺼내온뒤에, char* type으로 안전하게 바꾸어주는 역할을 하게 되는 거지요.


참고로, 함수의 인자가 char * 인곳에 const char* 형을 넣으면 컴파일 오류가 발생하기 때문에 (LPSTR)을 한번더 앞에 써주어서 강제 type casting을 한 것입니다.

반응형
/* ether-wake.c: Send a magic packet to wake up sleeping machines. */

static char version_msg[] =
"ether-wake.c: v1.08 3/31/2003 Donald Becker, http://www.scyld.com/";
static char brief_usage_msg[] =
"usage: ether-wake [-i <ifname>] [-p aa:bb:cc:dd[:ee:ff]] 00:11:22:33:44:55\n"
"   Use '-u' to see the complete set of options.\n";
static char usage_msg[] =
"usage: ether-wake [-i <ifname>] [-p aa:bb:cc:dd[:ee:ff]] 00:11:22:33:44:55

This program generates and transmits a Wake-On-LAN (WOL)
\"Magic Packet\", used for restarting machines that have been
soft-powered-down (ACPI D3-warm state).
It currently generates the standard AMD Magic Packet format, with
an optional password appended.

The single required parameter is the Ethernet MAC (station) address
of the machine to wake or a host ID with known NSS 'ethers' entry.
The MAC address may be found with the 'arp' program while the target
machine is awake.

Options:
  -b Send wake-up packet to the broadcast address.
  -D Increase the debug level.
  -i ifname Use interface IFNAME instead of the default 'eth0'.
  -p <pw>  Append the four or six byte password PW to the packet.
     A password is only required for a few adapter types.
     The password may be specified in ethernet hex format
     or dotted decimal (Internet address)
  -p 00:22:44:66:88:aa
  -p 192.168.1.1
";

/*
This program generates and transmits a Wake-On-LAN (WOL) "Magic Packet",
used for restarting machines that have been soft-powered-down
(ACPI D3-warm state).  It currently generates the standard AMD Magic Packet
format, with an optional password appended.

This software may be used and distributed according to the terms
of the GNU Public License, incorporated herein by reference.
Contact the author for use under other terms.

This source file was originally part of the network tricks package, and
is now distributed to support the Scyld Beowulf system.
Copyright 1999-2003 Donald Becker and Scyld Computing Corporation.

The author may be reached as becker@scyld, or C/O
  Scyld Computing Corporation
  410 Severn Ave., Suite 210
  Annapolis MD 21403

  Notes:
  On some systems dropping root capability allows the process to be
  dumped, traced or debugged.
  If someone traces this program, they get control of a raw socket.
  Linux handles this safely, but beware when porting this program.

  An alternative to needing 'root' is using a UDP broadcast socket, however
  doing so only works with adapters configured for unicast broadcast Rx
  filter.  That configuration consumes more power.
*/

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <ctype.h>
#include <string.h>

#if 0       /* Only exists on some versions. */
#include <ioctls.h>
#endif

#include <sys/socket.h>

#include <sys/types.h>
#include <sys/ioctl.h>
#include <linux/if.h>

#include <features.h>
#if __GLIBC__ >= 2 && __GLIBC_MINOR >= 1
#include <netpacket/packet.h>
#include <net/ethernet.h>
#else
#include <asm/types.h>
#include <linux/if_packet.h>
#include <linux/if_ether.h>
#endif
#include <netdb.h>
#include <netinet/ether.h>

/* Grrr, no consistency between include versions.
   Enable this if setsockopt() isn't declared with your library. */
#if 0
extern int setsockopt __P ((int __fd, int __level, int __optname,
       __ptr_t __optval, int __optlen));
#else    /* New, correct head files.  */
#include <sys/socket.h>
#endif
#ifdef USE_SENDMSG
#include <iovec.h>
#endif

u_char outpack[1000];
int outpack_sz = 0;
int debug = 0;
u_char wol_passwd[6];
int wol_passwd_sz = 0;

static int opt_no_src_addr = 0, opt_broadcast = 0;

static int get_dest_addr(const char *arg, struct ether_addr *eaddr);
static int get_fill(unsigned char *pkt, struct ether_addr *eaddr);
static int get_wol_pw(const char *optarg);

int main(int argc, char *argv[])
{
char *ifname = "eth0";
int one = 1;    /* True, for socket options. */
int s;      /* Raw socket */
int errflag = 0, verbose = 0, do_version = 0;
int perm_failure = 0;
int i, c, pktsize;
#if defined(PF_PACKET)
struct sockaddr_ll whereto;
#else
struct sockaddr whereto; /* who to wake up */
#endif
struct ether_addr eaddr;

while ((c = getopt(argc, argv, "bDi:p:uvV")) != -1)
  switch (c) {
  case 'b': opt_broadcast ; break;
  case 'D': debug ;   break;
  case 'i': ifname = optarg; break;
  case 'p': get_wol_pw(optarg); break;
  case 'u': printf(usage_msg); return 0;
  case 'v': verbose ;  break;
  case 'V': do_version ;  break;
  case '?':
   errflag ;
  }
if (verbose || do_version)
  printf("%s\n", version_msg);
if (errflag) {
  fprintf(stderr, brief_usage_msg);
  return 3;
}

if (optind == argc) {
  fprintf(stderr, "Specify the Ethernet address as 00:11:22:33:44:55.\n");
  return 3;
}

/* Note: PF_INET, SOCK_DGRAM, IPPROTO_UDP would allow SIOCGIFHWADDR to
    work as non-root, but we need SOCK_PACKET to specify the Ethernet
    destination address. */
#if defined(PF_PACKET)
s = socket(PF_PACKET, SOCK_RAW, 0);
#else
s = socket(AF_INET, SOCK_PACKET, SOCK_PACKET);
#endif
if (s < 0) {
  if (errno == EPERM)
   fprintf(stderr, "ether-wake: This program must be run as root.\n");
  else
   perror("ether-wake: socket");
  perm_failure ;
}
/* Don't revert if debugging allows a normal user to get the raw socket. */
setuid(getuid());

/* We look up the station address before reporting failure so that
    errors may be reported even when run as a normal user.
*/
if (get_dest_addr(argv[optind], &eaddr) != 0)
  return 3;
if (perm_failure && ! debug)
  return 2;

pktsize = get_fill(outpack, &eaddr);

/* Fill in the source address, if possible.
    The code to retrieve the local station address is Linux specific. */
if (! opt_no_src_addr) {
  struct ifreq if_hwaddr;
  unsigned char *hwaddr = if_hwaddr.ifr_hwaddr.sa_data;

  strcpy(if_hwaddr.ifr_name, ifname);
  if (ioctl(s, SIOCGIFHWADDR, &if_hwaddr) < 0) {
   fprintf(stderr, "SIOCGIFHWADDR on %s failed: %s\n", ifname,
     strerror(errno));
   /* Magic packets still work if our source address is bogus, but
      we fail just to be anal. */
   return 1;
  }
  memcpy(outpack 6, if_hwaddr.ifr_hwaddr.sa_data, 6);

  if (verbose) {
   printf("The hardware address (SIOCGIFHWADDR) of %s is type %d  "
       "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x.\n", ifname,
       if_hwaddr.ifr_hwaddr.sa_family, hwaddr[0], hwaddr[1],
       hwaddr[2], hwaddr[3], hwaddr[4], hwaddr[5]);
  }
}

if (wol_passwd_sz > 0) {
  memcpy(outpack pktsize, wol_passwd, wol_passwd_sz);
  pktsize = wol_passwd_sz;
}

if (verbose > 1) {
  printf("The final packet is: ");
  for (i = 0; i < pktsize; i )
   printf(" %2.2x", outpack[i]);
  printf(".\n");
}

/* This is necessary for broadcasts to work */
if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char *)&one, sizeof(one)) < 0)
  perror("setsockopt: SO_BROADCAST");

#if defined(PF_PACKET)
{
  struct ifreq ifr;
  strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
  if (ioctl(s, SIOCGIFINDEX, &ifr) == -1) {
   fprintf(stderr, "SIOCGIFINDEX on %s failed: %s\n", ifname,
     strerror(errno));
   return 1;
  }
  memset(&whereto, 0, sizeof(whereto));
  whereto.sll_family = AF_PACKET;
  whereto.sll_ifindex = ifr.ifr_ifindex;
  /* The manual page incorrectly claims the address must be filled.
     We do so because the code may change to match the docs. */
  whereto.sll_halen = ETH_ALEN;
  memcpy(whereto.sll_addr, outpack, ETH_ALEN);

}
#else
whereto.sa_family = 0;
strcpy(whereto.sa_data, ifname);
#endif

if ((i = sendto(s, outpack, pktsize, 0, (struct sockaddr *)&whereto,
     sizeof(whereto))) < 0)
  perror("sendto");
else if (debug)
  printf("Sendto worked ! %d.\n", i);

#ifdef USE_SEND
if (bind(s, &whereto, sizeof(whereto)) < 0)
  perror("bind");
else if (send(s, outpack, 100, 0) < 0)
  perror("send");
#endif
#ifdef USE_SENDMSG
{
  struct msghdr msghdr;
  struct iovec iovector[1];
  msghdr.msg_name = &whereto;
  msghdr.msg_namelen = sizeof(whereto);
  msghdr.msg_iov = iovector;
  msghdr.msg_iovlen = 1;
  iovector[0].iov_base = outpack;
  iovector[0].iov_len = pktsize;
  if ((i = sendmsg(s, &msghdr, 0)) < 0)
   perror("sendmsg");
  else if (debug)
   printf("sendmsg worked, %d (%d).\n", i, errno);
}
#endif

return 0;
}

/* Convert the host ID string to a MAC address.
   The string may be a
Host name
    IP address string
MAC address string
*/

static int get_dest_addr(const char *hostid, struct ether_addr *eaddr)
{
struct ether_addr *eap;

eap = ether_aton(hostid);
if (eap) {
  *eaddr = *eap;
  if (debug)
   fprintf(stderr, "The target station address is %s.\n",
     ether_ntoa(eaddr));
} else if (ether_hostton(hostid, eaddr) == 0) {
  if (debug)
   fprintf(stderr, "Station address for hostname %s is %s.\n",
     hostid, ether_ntoa(eaddr));
} else {
  (void)fprintf(stderr,
       "ether-wake: The Magic Packet host address must be "
       "specified as\n"
       "  - a station address, 00:11:22:33:44:55, or\n"
       "  - a hostname with a known 'ethers' entry.\n");
  return -1;
}
return 0;
}


static int get_fill(unsigned char *pkt, struct ether_addr *eaddr)
{
int offset, i;
unsigned char *station_addr = eaddr->ether_addr_octet;

if (opt_broadcast)
  memset(pkt 0, 0xff, 6);
else
  memcpy(pkt, station_addr, 6);
memcpy(pkt 6, station_addr, 6);
pkt[12] = 0x08;    /* Or 0x0806 for ARP, 0x8035 for RARP */
pkt[13] = 0x42;
offset = 14;

memset(pkt offset, 0xff, 6);
offset = 6;

for (i = 0; i < 16; i ) {
  memcpy(pkt offset, station_addr, 6);
  offset = 6;
}
if (debug) {
  fprintf(stderr, "Packet is ");
  for (i = 0; i < offset; i )
   fprintf(stderr, " %2.2x", pkt[i]);
  fprintf(stderr, ".\n");
}
return offset;
}

static int get_wol_pw(const char *optarg)
{
int passwd[6];
int byte_cnt;
int i;

byte_cnt = sscanf(optarg, "%2x:%2x:%2x:%2x:%2x:%2x",
       &passwd[0], &passwd[1], &passwd[2],
       &passwd[3], &passwd[4], &passwd[5]);
if (byte_cnt < 4)
  byte_cnt = sscanf(optarg, "%d.%d.%d.%d",
        &passwd[0], &passwd[1], &passwd[2], &passwd[3]);
if (byte_cnt < 4) {
  fprintf(stderr, "Unable to read the Wake-On-LAN password.\n");
  return 0;
}
printf(" The Magic packet password is %2.2x %2.2x %2.2x %2.2x (%d).\n",
     passwd[0], passwd[1], passwd[2], passwd[3], byte_cnt);
for (i = 0; i < byte_cnt; i )
  wol_passwd[i] = passwd[i];
return wol_passwd_sz = byte_cnt;
}

#if 0
{
to = (struct sockaddr_in *)&whereto;
to->sin_family = AF_INET;
if (inet_aton(target, &to->sin_addr)) {
  hostname = target;
}
memset (&sa, 0, sizeof sa);
sa.sa_family = AF_INET;
strncpy (sa.sa_data, interface, sizeof sa.sa_data);
sendto (sock, buf, bufix len, 0, &sa, sizeof sa);
strncpy (sa.sa_data, interface, sizeof sa.sa_data);
#if 1
sendto (sock, buf, bufix len, 0, &sa, sizeof sa);
#else
bind (sock, &sa, sizeof sa);
connect();
send (sock, buf, bufix len, 0);
#endif
}
#endif


/*
* Local variables:
*  compile-command: "gcc -O -Wall -o ether-wake ether-wake.c"
*  c-indent-level: 4
*  c-basic-offset: 4
*  c-indent-level: 4
*  tab-width: 4
* End:
*/




출처 : http://www.scyld.com/expert/wake-on-lan.html

'Programming' 카테고리의 다른 글

Adobe AIR 3 / 기술 사양  (0) 2012.02.06
11월 17일 랩실 C언어 교육  (0) 2009.11.17
WOL c++ sourcecode  (0) 2009.10.29
IE8설치 후 VS에러 패치  (0) 2009.10.14
컴포넌트의 종류  (0) 2009.08.28
반응형
IE8 설치후 VisualStudio에서 Visual C++ 스마트장치 프로젝트 생성시 "프로젝트를 만들지 못했습니다."라는 에러와 함께 프로젝트 생성에 실패하는 경우 이렇게 해결한다.

1. 레지스트 편집기를 연다.
2. "HKEY_CURRENT_USER\Software\Microsoft]Windows\InternetSettings\Zones" 로 이동한다.
3. 해당 경로의 하위에 "1000"이름의 키를 생성한다.
4. 생선된 키에 "1207"이름의 DWORD값을 생성, 값은 기본값인 "0"으로 한다.
5. VisualStudio를 재 실행하여 정상 동작 여부를 확인한다.

참고글 : http://blogs.msdn.com/vcblog/archive/2009/03/28/some-vs2005-and-vs2008-wizards-pop-up-script-error.aspx

'Programming' 카테고리의 다른 글

WOL c++ 다른 소스코드  (0) 2009.10.29
WOL c++ sourcecode  (0) 2009.10.29
컴포넌트의 종류  (0) 2009.08.28
Flex Builder 3  (0) 2009.08.28
직각삼각형 출력  (0) 2009.08.12

+ Recent posts