2020년 4월 24일 금요일

UDP 통신에서 MULTICAST이용하기

MFC CAsyncSocket이용하기

CmyAsyncSocket m_UDP;

// 약속된 포트를 연다.  받기 위해서
m_UDP.Create(m_port,SOCK_DGRAM,FD_READ | FD_WRITE);  // SOCK_DGRAM : UDP통신

// 보내기
SOCKADDR_IN saddr;
memset(&saddr,0,sizeof(saddr));
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = inet_addr( ipaddress );  // 보낼곳.
saddr.sin_port=htons(m_port);                       // 그 약속된 포트
m_UDP.SendTo(m_msg.GetBuffer(0), 1024, (SOCKADDR*)&saddr, sizeof(saddr));

// 받기
SOCKADDR_IN saddr;
int size=sizeof(saddr);
TCHAR tbuff[1024]={0,};
int nRead = m_UDP.ReceiveFrom(tbuff,1024,(SOCKADDR*)&saddr,&size);

// 다음은 MULTICAST ...
// 옵션을 추가한다... D ipaddress group으로 전송하고자 한다.
// 보내기 위해서  TTL  로 뚫고  IF를 local ip로 지정한다.
int ttl=2;
m_UDP.SetSockOpt(IP_MULTICAST_TTL, (char *)&ttl, sizeof(ttl), IPPROTO_IP) ;
char ipaddr[25]; // local address
WideCharToMultiByte(CP_ACP, 0, m_ip, -1, ipaddr, 25, NULL, NULL);
IN_ADDR localaddr;
localaddr.s_addr = inet_addr( ipaddr );
m_UDP.SetSockOpt(IP_MULTICAST_IF, (char *)&localaddr, sizeof(localaddr), IPPROTO_IP) ;

// 받기 위해서  D ip address group을 등록한다.
char ipaddress[25]={"224.0.0.123"};  //D group ip address 사용. 
struct ip_mreq mreq ;
memset(&mreq, 0, sizeof(mreq)) ;
mreq.imr_multiaddr.s_addr = inet_addr( ipaddress );
mreq.imr_interface.s_addr = htons(m_port); //htonl( INADDR_ANY );
mreq.imr_interface.s_addr = htonl( INADDR_ANY );
m_UDP.SetSockOpt(IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq), IPPROTO_IP) ;

// 옵션 지정후 보내기는 D group ip로 보내야 한다.
saddr.sin_addr.s_addr = inet_addr( "224.0.0.123" );  
m_UDP.SendTo(m_msg.GetBuffer(0), 1024, (SOCKADDR*)&saddr, sizeof(saddr));
// 그러면 Multicast 받기 그룹에 등록된 곳을 받는다.    

2020년 4월 8일 수요일

UNICODE에서 CString format 사용하기...


 filebuf.Format(_T("%s\\%s"), CString(AppPath), _T("APCDATA"));
  // UNICODE 뒷부분이 안보인다.
 BOOL ret = PathIsDirectory( filebuf );
 char str[1024]; sprintf(str, "%s\\%s", AppPath, "APCDATA" );
 // UICODE에서 Format에 char 있으면 안된다. 2020-04-08  ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
 if( GetFileAttributes( filebuf ) == 0xffffffff ){
  if ( ! ::CreateDirectory( filebuf, NULL ) )
   ::MessageBox((HWND)NULL,_T("./APCDATA 폴더 생성 실패."),NULL,MB_OK|MB_TOPMOST);
 }

2020년 4월 4일 토요일

CXIMAGE를 사용하면 BMP를 JPG로 저장할 수 있다.


#include "./cximage/cximage/ximage.h"
#pragma comment(lib,"./cximage/cximage/CxImageDLL/Debug/cximagecrtd.lib")
//#pragma comment(lib,"./cximage/cximage/Debug/cximage.lib")



CxImage* newImage = new CxImage();
newImage->Load(file_bmp, CXIMAGE_FORMAT_BMP);

BOOL bRet;
if (newImage->IsValid()){
newImage->Save(path,CXIMAGE_FORMAT_JPG);
}

delete newImage;
newImage = NULL;

2020년 3월 23일 월요일

인스턴스와 핸들

A라는 프로그램이 B 라는 프로그램의 C라는 서브 윈도우에 버튼을 누르는 효과나 커멘드 메시지를 날려 메뉴를 선택하는 행위하는 것을 구현하려면 ...


그때 필요한것은 B의 신스턴스요 그 인스턴스가 관장하는 그리고 액비브 된 C라는 윈도우의 핸들.

2020년 1월 18일 토요일

MSSQL express 사용

MS SQL Server Express 사용

  1. 2008 버젼을 사용했다.  express 버젼은 데이터 가져오기가 안될 수 있다는 메세지는 2014에서도 똑 같이 나타난다. 아마도 2014에서도 될듯.

  2. SQLEXPRWT_x64_KOR 를 사용했다.  SQLManagementStudio_x64_KOR가 포함되어 있다.

  3. 보안이 되어있으면 충돌이 일어나니 우선 지우자.

  4. 설치는 디폴트로 다하고 우선 윈도우즈 인증 모드로 들어간다.

  5. 데이터베이스에 MxxxFxxx을 생성한다.

  6. 사용자도 생성한다.  elexxxx   elexxxx
     사용자 옵션에 sysadmin을 추가하고, 생성 데이터베이스 기본으로 가져가고, owner처리하고 accessadmin도 해두자.

  7.  데이터 가져오기를 한다.   ms access는 보안으로 되어 있다면 열기에서 단독모드로 열기를 하고 암호를 제거한 상태로 저장해야한다.  그러면 데이터 가져오기를 할 수 잇다.

  8.  속성에서 윈도우즈 인증 모드와 로그인 복합 모드가 되게 한다.

  9.  SQL SERVER가  tcp/ip 가 되게 한다. 1433포트로 가능하게 한다.  외부에서 접속하기 위해서는 방화벽도 손봐야 한다.