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;