사업하면서 참 이런저런 것들을 느끼게 된다..


이제 시작인데 며칠동안 여기저기서 사람들을 만나면서 느껴본 것은 참 경기는 안 좋고..


일은 많이 시키면서 돈은 적게 주려고만 한다는 것이다.


개발 건도 있고, 개조건도 있지만, 너무나 단가가 낮게만 부른다는 것이다..


슬프다..


그런데, 이렇게까지 단가를 낮춰놓은건 다 그들만의 탓은 아니겠지...




사업자 정보 표시
가나소프트 | 김용유 | 충남 천안시 동남구 목천읍 서리2길 42-1 | 사업자 등록번호 : 312-33-14797 | TEL : 070-8659-0316 | Mail : yykim@gana-soft.com | 통신판매신고번호 : 12390123호 | 사이버몰의 이용약관 바로가기




사업을 시작하면서 첫 프로젝트는 PLC와 통신을 해 현재 상태 모니터링/운용/데이터처리를 하는 프로젝트이다.


약 두달정도가 걸릴것으로 생각되는 것으로 곧 시작할 예정이다..


기존 작업 내용을 컨버팅 및 신규 개발하는 건으로 조금은 복잡할 지도 모르겠지만,


어차피 부딪혀야만 되는 것이니까..


사업자 정보 표시
가나소프트 | 김용유 | 충남 천안시 동남구 목천읍 서리2길 42-1 | 사업자 등록번호 : 312-33-14797 | TEL : 070-8659-0316 | Mail : yykim@gana-soft.com | 통신판매신고번호 : 12390123호 | 사이버몰의 이용약관 바로가기

'개발이야기' 카테고리의 다른 글

사업 시작 후 첫 프로젝트  (1) 2014.12.10
  1. 2월말 1차 완료...

    4월 초 1회 출장..

    아직까지 끝나지 않았지만,.... 거의 끝난 프로젝트...

void DrawTransparentBitmap(HDC hdc, HBITMAP hBitmap, LONG xStart, LONG yStart, COLORREF cTransparentColor)  
{  
BITMAP bm;  
COLORREF cColor;  
HBITMAP bmAndBack, bmAndObject, bmAndMem, bmSave;  
HBITMAP bmBackOld, bmObjectOld, bmMemOld, bmSaveOld;  
HDC hdcMem, hdcBack, hdcObject, hdcTemp, hdcSave;  
POINT ptSize;  
/* 초기화 작업 */
hdcTemp = CreateCompatibleDC(hdc);  
SelectObject(hdcTemp, hBitmap); // 비트맵 선택

GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&bm);  
ptSize.x = bm.bmWidth; // 비트맵 가로 크기 
ptSize.y = bm.bmHeight; // 비트맵 세로 크기
DPtoLP(hdcTemp, &ptSize, 1); // 디바이스를 논리적 위치로 변경

// 작업용 DC 생성
hdcBack = CreateCompatibleDC(hdc);  
hdcObject = CreateCompatibleDC(hdc);  
hdcMem = CreateCompatibleDC(hdc);  
hdcSave = CreateCompatibleDC(hdc);  

// 흑백 연산 (and,or연산)에 필요한 비트맵 생성 
bmAndBack = CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL);  
bmAndObject = CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL);  
// 작업용 비트맵들 생성 
bmAndMem = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y);  
bmSave = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y);  

// 각 비트맵 삭제 위한 old 비트맵 생성 
bmBackOld = (HBITMAP)SelectObject(hdcBack, bmAndBack);  
bmObjectOld = (HBITMAP)SelectObject(hdcObject, bmAndObject);  
bmMemOld = (HBITMAP)SelectObject(hdcMem, bmAndMem);  
bmSaveOld = (HBITMAP)SelectObject(hdcSave, bmSave);  

//그려질 DC와 생성된 임시DC의 맵핑 모드 일치화 
SetMapMode(hdcTemp, GetMapMode(hdc));  

// 원본 보전 작업
BitBlt(hdcSave, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCCOPY);  

// 투명화 시킬 색을 Tempdc의 배경색으로 설정,
// 이때 SetBkColor의 리턴 값으로 원본 색 저장
cColor = SetBkColor(hdcTemp, cTransparentColor);  

/* 주어진 비트맵의 투명색(BkColor로 지정된)은 힌색으로,
나머지는 검은색으로하여 BlackWhitedc_1에 저장 */
BitBlt(hdcObject, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0,   
SRCCOPY);  

// 배경 색을 원본 색상 DC를 가져오기
SetBkColor(hdcTemp, cColor);  

// BlackWhitedc_1를 이용 투명 영역(검은색), 비투명 영역(힌색)으로 된 DC생성 
BitBlt(hdcBack, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0,   NOTSRCCOPY);  

// 그려질 hdc에서 비트맵이 위치할 곳의 배경을 작업용 DC로 이동 
BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdc, xStart, yStart, SRCCOPY);  
//BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdc, 0, 0, SRCCOPY);  

// 그려질 배경과 and 연산을 통해 배경투명구현(힌색 소멸), 비투명 영역은 검은 색으로
BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0, SRCAND);  

// 주어진 비트맵과 and 연산을 통해 투명부분(검은색으로), 비투명은 그대로
BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcBack, 0, 0, SRCAND);  

// 위에서 만든 2개의 DC(Workdc, Tempdc)의 or 연산을 통해 두 DC결합 
BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCPAINT);  

//  결과를 표시
 BitBlt(hdc, xStart, yStart, ptSize.x, ptSize.y, hdcMem, 0, 0, SRCCOPY);  

//  원본을 임시 DC에 복구
BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcSave, 0, 0, SRCCOPY);  

// 메모리에 있는 각 비트맵 삭제
DeleteObject(SelectObject(hdcBack, bmAndBack));  
DeleteObject(SelectObject(hdcObject,bmAndObject));  
DeleteObject(SelectObject(hdcMem, bmAndMem));  
DeleteObject(SelectObject(hdcSave, bmSave));  
DeleteObject(SelectObject(hdcBack, bmBackOld));  
DeleteObject(SelectObject(hdcObject,bmObjectOld));  
DeleteObject(SelectObject(hdcMem, bmMemOld));  
DeleteObject(SelectObject(hdcSave, bmSaveOld));  

// 각 DC삭제 
DeleteDC(hdcBack);  
DeleteDC(hdcObject);
DeleteDC(hdcMem);    
DeleteDC(hdcSave);  
DeleteDC(hdcTemp);  
DeleteDC(hdc); // 자신의 DC를 삭제하지 않으면 GDI 객체는 계속 늘어나게 된다..
 }  


/// 사용 예시..
DrawTransparentBitmap(::GetDC(((CStatic*)GetDlgItem(컨트롤))->GetSafeHwnd()), (BMP), 0, 0, 색상);

// 미리 정의해 놓고 사용하면 좀더 편리함...
#define TRANS_BITMAP(CTRL, BMP); DrawTransparentBitmap(::GetDC(((CStatic*)GetDlgItem(CTRL))->GetSafeHwnd()), (BMP), 0, 0, BLACK);


사업자 정보 표시
가나소프트 | 김용유 | 충남 천안시 동남구 목천읍 서리2길 42-1 | 사업자 등록번호 : 312-33-14797 | TEL : 070-8659-0316 | Mail : yykim@gana-soft.com | 통신판매신고번호 : 12390123호 | 사이버몰의 이용약관 바로가기

/* =-=-=-=-=-=-=-=-=-=-=-=-=-= Window Messages =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/

#define WM_NULL           0x0000
#define WM_CREATE                   0x0001
#define WM_DESTROY                  0x0002
#define WM_MOVE                     0x0003
#define WM_SIZE                     0x0005
#define WM_ACTIVATE                 0x0006

/* WM_ACTIVATE state values */
#define     WA_INACTIVE             0
#define     WA_ACTIVE               1
#define     WA_CLICKACTIVE          2

#define WM_SETFOCUS                 0x0007
#define WM_KILLFOCUS                0x0008
#define WM_ENABLE                   0x000A
#define WM_SETREDRAW                0x000B
#define WM_SETTEXT                  0x000C
#define WM_GETTEXT                  0x000D
#define WM_GETTEXTLENGTH            0x000E
#define WM_PAINT                    0x000F
#define WM_CLOSE                    0x0010
#define WM_QUERYENDSESSION         0x0011
#define WM_QUIT                     0x0012
#define WM_QUERYOPEN                0x0013
#define WM_ERASEBKGND               0x0014
#define WM_SYSCOLORCHANGE          0x0015
#define WM_ENDSESSION               0x0016
#define WM_SHOWWINDOW               0x0018
#define WM_WININICHANGE             0x001A
#if(WINVER >= 0x0400)
#define WM_SETTINGCHANGE        WM_WININICHANGE
#endif /* WINVER >= 0x0400 */

#define WM_DEVMODECHANGE          0x001B
#define WM_ACTIVATEAPP              0x001C
#define WM_FONTCHANGE               0x001D
#define WM_TIMECHANGE               0x001E
#define WM_CANCELMODE               0x001F
#define WM_SETCURSOR                0x0020
#define WM_MOUSEACTIVATE           0x0021
#define WM_CHILDACTIVATE            0x0022
#define WM_QUEUESYNC                0x0023

#define WM_GETMINMAXINFO            0x0024
// end_r_winuser

// begin_r_winuser
#define WM_PAINTICON             0x0026
#define WM_ICONERASEBKGND      0x0027
#define WM_NEXTDLGCTL               0x0028
#define WM_SPOOLERSTATUS           0x002A
#define WM_DRAWITEM                 0x002B
#define WM_MEASUREITEM              0x002C
#define WM_DELETEITEM               0x002D
#define WM_VKEYTOITEM               0x002E
#define WM_CHARTOITEM               0x002F
#define WM_SETFONT                  0x0030
#define WM_GETFONT                  0x0031
#define WM_SETHOTKEY                0x0032
#define WM_GETHOTKEY                0x0033
#define WM_QUERYDRAGICON            0x0037
#define WM_COMPAREITEM              0x0039
#if(WINVER >= 0x0500)
#define WM_GETOBJECT             0x003D
#endif /* WINVER >= 0x0500 */
#define WM_COMPACTING            0x0041
#define WM_COMMNOTIFY             0x0044  /* no longer suported */
#define WM_WINDOWPOSCHANGING   0x0046
#define WM_WINDOWPOSCHANGED    0x0047

#define WM_POWER                 0x0048
/*
* wParam for WM_POWER window message and DRV_POWER driver notification
*/
#define PWR_OK                   1
#define PWR_FAIL                 (-1)
#define PWR_SUSPENDREQUEST      1
#define PWR_SUSPENDRESUME       2
#define PWR_CRITICALRESUME       3

#define WM_COPYDATA              0x004A
#define WM_CANCELJOURNAL         0x004B
// end_r_winuser

// begin_r_winuser
#if(WINVER >= 0x0400)
#define WM_NOTIFY                0x004E
#define WM_INPUTLANGCHANGEREQUEST  0x0050
#define WM_INPUTLANGCHANGE      0x0051
#define WM_TCARD                    0x0052
#define WM_HELP                     0x0053
#define WM_USERCHANGED            0x0054
#define WM_NOTIFYFORMAT           0x0055

#define NFR_ANSI                    1
#define NFR_UNICODE                 2
#define NF_QUERY                    3
#define NF_REQUERY                  4

#define WM_CONTEXTMENU              0x007B
#define WM_STYLECHANGING            0x007C
#define WM_STYLECHANGED             0x007D
#define WM_DISPLAYCHANGE            0x007E
#define WM_GETICON                  0x007F
#define WM_SETICON                  0x0080
#endif /* WINVER >= 0x0400 */

#define WM_NCCREATE                 0x0081
#define WM_NCDESTROY               0x0082
#define WM_NCCALCSIZE              0x0083
#define WM_NCHITTEST                0x0084
#define WM_NCPAINT                  0x0085
#define WM_NCACTIVATE              0x0086
#define WM_GETDLGCODE             0x0087
#define WM_SYNCPAINT                0x0088
#define WM_NCMOUSEMOVE          0x00A0
#define WM_NCLBUTTONDOWN       0x00A1
#define WM_NCLBUTTONUP           0x00A2
#define WM_NCLBUTTONDBLCLK          0x00A3
#define WM_NCRBUTTONDOWN            0x00A4
#define WM_NCRBUTTONUP              0x00A5
#define WM_NCRBUTTONDBLCLK    0x00A6
#define WM_NCMBUTTONDOWN      0x00A7
#define WM_NCMBUTTONUP          0x00A8
#define WM_NCMBUTTONDBLCLK    0x00A9

#define WM_KEYFIRST                0x0100
#define WM_KEYDOWN                  0x0100
#define WM_KEYUP                    0x0101
#define WM_CHAR                     0x0102
#define WM_DEADCHAR                 0x0103
#define WM_SYSKEYDOWN              0x0104
#define WM_SYSKEYUP                 0x0105
#define WM_SYSCHAR                  0x0106
#define WM_SYSDEADCHAR             0x0107
#define WM_KEYLAST                  0x0108

#if(WINVER >= 0x0400)
#define WM_IME_STARTCOMPOSITION  0x010D
#define WM_IME_ENDCOMPOSITION      0x010E
#define WM_IME_COMPOSITION          0x010F
#define WM_IME_KEYLAST              0x010F
#endif /* WINVER >= 0x0400 */

#define WM_INITDIALOG               0x0110
#define WM_COMMAND                  0x0111
#define WM_SYSCOMMAND              0x0112
#define WM_TIMER                    0x0113
#define WM_HSCROLL                  0x0114
#define WM_VSCROLL                  0x0115
#define WM_INITMENU                 0x0116
#define WM_INITMENUPOPUP            0x0117
#define WM_MENUSELECT               0x011F
#define WM_MENUCHAR                 0x0120
#define WM_ENTERIDLE                0x0121
#if(WINVER >= 0x0500)
#define WM_MENURBUTTONUP          0x0122
#define WM_MENUDRAG                 0x0123
#define WM_MENUGETOBJECT          0x0124
#define WM_UNINITMENUPOPUP        0x0125
#define WM_MENUCOMMAND            0x0126
#endif /* WINVER >= 0x0500 */

#define WM_CTLCOLORMSGBOX        0x0132
#define WM_CTLCOLOREDIT             0x0133
#define WM_CTLCOLORLISTBOX        0x0134
#define WM_CTLCOLORBTN              0x0135
#define WM_CTLCOLORDLG              0x0136
#define WM_CTLCOLORSCROLLBAR    0x0137
#define WM_CTLCOLORSTATIC          0x0138

#define WM_MOUSEFIRST               0x0200
#define WM_MOUSEMOVE                0x0200
#define WM_LBUTTONDOWN              0x0201
#define WM_LBUTTONUP                0x0202
#define WM_LBUTTONDBLCLK            0x0203
#define WM_RBUTTONDOWN              0x0204
#define WM_RBUTTONUP                0x0205
#define WM_RBUTTONDBLCLK            0x0206
#define WM_MBUTTONDOWN              0x0207
#define WM_MBUTTONUP                0x0208
#define WM_MBUTTONDBLCLK            0x0209

#if (_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)
#define WM_MOUSEWHEEL              0x020A
#define WM_MOUSELAST                0x020A
#else
#define WM_MOUSELAST                0x0209
#endif /* if (_WIN32_WINNT < 0x0400) */

#if(_WIN32_WINNT >= 0x0400)
#define WHEEL_DELTA              120     /* Value for rolling one detent */
#endif /* _WIN32_WINNT >= 0x0400 */
#if(_WIN32_WINNT >= 0x0400)
#define WHEEL_PAGESCROLL            (UINT_MAX) /* Scroll one page */
#endif /* _WIN32_WINNT >= 0x0400 */

#define WM_PARENTNOTIFY          0x0210
#define WM_ENTERMENULOOP         0x0211
#define WM_EXITMENULOOP          0x0212

#if(WINVER >= 0x0400)
#define WM_NEXTMENU              0x0213
// end_r_winuser


사업자 정보 표시
가나소프트 | 김용유 | 충남 천안시 동남구 목천읍 서리2길 42-1 | 사업자 등록번호 : 312-33-14797 | TEL : 070-8659-0316 | Mail : yykim@gana-soft.com | 통신판매신고번호 : 12390123호 | 사이버몰의 이용약관 바로가기

1) WideString 
캐스팅 시키는 함수. 아래 방법으로 하시면, A에 wchat_t 형식으로 Hello가 들어갑니다. 

A = WideString("Hello"); 

2) StringToOleStr 
원라는 AnsiString용 함수입니다. char 배열도 사용할 수 있습니다. 

A = StringToOleStr("Hello"); 

3) MultiByteToWideChar 
이 방법을 쓰시면 UTF8 형식으로도 변경할 수 있습니다. UniCode를 사용하는 경우, 이 API를 꼭 이용하셔야 합니다. UTF8을 원하시면 CP_ACP 부분을 CP_UTF8 로 바꾸어 주시면 됩니다. 이 방법은 조금 복잡합니다. 먼저 문자열 길이가 얼마나 나오는지 얻어낸 다음, 그 길이만큼 변수를 잡고, 변환을 다시 시켜야 합니다. 

String            stString = "HELLO"; 
int               itWideSize = MultiByteToWideChar(CP_UTF8, 0, stString.c_str(), stString.Length() + 1, NULL, 0); 
wchar_t           *wcTarget = new wchar_t[itWideSize]; 

MultiByteToWideChar(CP_ACP, 0, stString.c_str(), stString.Length() + 1, wcTarget, itWideSize); 
=========================================================================================================

볼랜드포럼 유영인님 글에서 발췌


사업자 정보 표시
가나소프트 | 김용유 | 충남 천안시 동남구 목천읍 서리2길 42-1 | 사업자 등록번호 : 312-33-14797 | TEL : 070-8659-0316 | Mail : yykim@gana-soft.com | 통신판매신고번호 : 12390123호 | 사이버몰의 이용약관 바로가기

MFC에서 프로젝트를 FormView를 쓰면 화면 전환시에 사용하는 법은 다음과 같이 난 작성한다...

메인폼에 사용자 메시지를 받을 수 있는 함수를 다음과 같이 작성한다..

LRESULT CMainFrame::OnFormChange(WPARAM wParam, LPARAM lParam)
{
// TRACE0(" User Message!!");

// Form Change
CView* pOldActiveView = GetActiveView();
CView* pNewActiveView = (CView*)GetDlgItem(wParam);
if(pNewActiveView==NULL) 
{
switch (wParam)  {
case IDD_LDP_CAL_FORM :
pNewActiveView = (CView*)new CLDPSetupCalView; 
TRACE0(" Menu Cal Form Change!!");
break;
case IDD_LDP_MAIN_FORM :
pNewActiveView = (CView*)new CLDPSetupMainView;
TRACE0(" Menu Cal MainChange!!");
break;
}
CCreateContext context;  
context.m_pCurrentDoc=pOldActiveView->GetDocument() ;
pNewActiveView->Create(NULL,NULL,0L,CFrameWnd::rectDefault,this,wParam,&context) ;
pNewActiveView->OnInitialUpdate() ;
}
SetActiveView(pNewActiveView) ;
pNewActiveView->ShowWindow(SW_SHOW) ;
if    (pOldActiveView->GetRuntimeClass()==RUNTIME_CLASS(CLDPSetupCalView))      
pOldActiveView->SetDlgCtrlID(IDD_LDP_CAL_FORM);
else if(pOldActiveView->GetRuntimeClass()==RUNTIME_CLASS(CLDPSetupMainView)) 
pOldActiveView->SetDlgCtrlID(IDD_LDP_MAIN_FORM);
pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST) ;
RecalcLayout();
delete pOldActiveView;
CurrentForm = wParam;

return 0;
}



이런식의 함수를 사용하고자 하는 곳에서...

::SendMessage(AfxGetMainWnd()->m_hWnd, UM_MENUCHANGE, IDD_LDP_CAL_FORM, NULL); 

이런식으로 호출해서 폼이 바뀌는방식을 주로 쓴다..


그리고 C++ 빌더에서는 다음과 같이 사용한다...
1. 이전 화면이 있으면 삭제..
2. 화면 호출 및 생성
3. 화면 크기를 메인폼에 맞게 수정..(Resize 함수 이용)

// 그려질 폼이 메인폼에 맞게 사이즈를 맞추어 준다...

void __fastcall TMainForm::FormResize(TObject *Sender)

{

if(Frame_User){

Frame_User->Width = ClientWidth;

Frame_User->Height = ClientHeight;

return;

}

else if(Frame_Group)

{

Frame_Group->Width = ClientWidth;

Frame_Group->Height = ClientHeight;

}

}


// 기존의 폼을 제거한다..


int __fastcall TMainForm::DeleteFrame()

{

// 사용자 등록 화면 삭제.

if(Frame_User){

delete Frame_User;

Frame_User = NULL;

}

//...//

}



// 그리고 호출 및 생성은...

void __fastcall TMainForm::N2Click(TObject *Sender)

{ // 사용자 등록

DeleteFrame();  // 호출되어 있는 폼 삭제

Frame_User = new TFrame_User(this); // 현재 폼을 오너로 해서 생성

TRect rect = Rect(0,0, ClientWidth, ClientHeight); // 현재 폼을 전체 덮는 크기로 설정

Frame_User->Dock(this, rect); // 현재 폼을 도킹 시켜 보이게 한다..


다음과 같이 처리한다... 어떤 방식이 더 낫다고 볼 수 없다..


김용유닷컴(kimyongyu.com) 예전글에서 발췌 수정

사업자 정보 표시
가나소프트 | 김용유 | 충남 천안시 동남구 목천읍 서리2길 42-1 | 사업자 등록번호 : 312-33-14797 | TEL : 070-8659-0316 | Mail : yykim@gana-soft.com | 통신판매신고번호 : 12390123호 | 사이버몰의 이용약관 바로가기

**********************************************************/

/*                                                        */

/*          Test program for Communication functions      */

/*                                                        */

/*  Copyright (C) 1999 MITSUBISHI Electric Corporation    */

/*  All Rights Reserved                                   */

/**********************************************************/

/********************************************

* Include files *

********************************************/

#include        <stdio.h>

#include        <winsock.h>


#define FLAG_OFF  0 // 종료 플래그 OFF

#define FLAG_ON  1 // 종료 플래그 ON

#define SOCK_OK  0 // 정상 종료 

#define SOCK_NG -1 // 이상 종료 

#define BUF_SIZE 80 // 버퍼 사이즈 


#define ERROR_INITIAL  0 // 초기화 에러 

#define ERROR_SOCKET  1 // 소켓 작성 에러 

#define ERROR_BIND  2 // 바인드 에러

#define ERROR_CONNECT  3 // 커넥트 에러

#define ERROR_SEND  4 // 송신 에러 

#define ERROR_RECEIVE  5 // 수신 에러 

#define ERROR_SHUTDOWN  6 // 셧다운 에러 

#define ERROR_CLOSE  7 // 회선 클로즈 에러 


typedef struct sck_inf {

struct in_addr my_addr;

unsigned short my_port;

struct in_addr aj_addr;

unsigned short aj_port;

};


int nErrorStatus; // 에러 정보 저장 변수

int Dmykeyin; // 더미 키 입력

int Closeflag; // 커넥션 종료 플래그

int socketno;


/***************************************************

* Reads in device "D" of specified No              *

* on station No 1                                  *

***************************************************/

int main()

{

WORD wVersionRequested = MAKEWORD(1,1);  

WSADATA wsaData; // Winsock Ver 1.1 요구 

int length; // 교신 데이터 길이 

int result;

unsigned char s_buf[BUF_SIZE]; // 송신 버퍼 

unsigned char r_buf[BUF_SIZE]; // 수신 버퍼 

struct sck_inf sc; // 구조체 변수 선언

struct sockaddr_in hostdata; // 상대 기기측 데이터

struct sockaddr_in aj71e71; // Ethernet 모듈측 데이터 

void Sockerror(int); // 에러 처리 함수 

sc.my_addr.s_addr = htonl(INADDR_ANY); // 상대 기기측 IP Address(PC쪽 IP Address)

sc.my_port = htons(0); // 상대 기기측 Port No.(PC쪽 Port No.)

sc.aj_addr.s_addr = inet_addr("192.168.16.232"); // Ethernet 모듈측 IP Address(C00001FD) - PLC 모듈 IP 셋팅

sc.aj_port = htons(5002); // Ethernet 모듈측 Port No. - PLC 모듈 

// PLC Port No : 138A(16진수)로 셋팅


Closeflag = FLAG_OFF; // 커넥션 종료 플래그 OFF


nErrorStatus = WSAStartup(wVersionRequested, &wsaData);

if (nErrorStatus != SOCK_OK) // Winsock 초기화 처리

{

Sockerror(ERROR_INITIAL);

return(SOCK_NG);

}


printf("Winsock Version is %d, %d\n", HIBYTE(wsaData.wVersion), LOBYTE(wsaData.wVersion));

printf("AJ_test Start\n");


socketno = socket(AF_INET, SOCK_STREAM, 0); // 소켓 생성

if (socketno == INVALID_SOCKET) // TCP/IP의 소켓 작성 

{

Sockerror(ERROR_SOCKET);

return(SOCK_NG);

}

hostdata.sin_family = AF_INET; // PC 쪽 Socket 구조체 정의 

hostdata.sin_port = sc.my_port; // PC 쪽 Port No, IP Address

hostdata.sin_addr.s_addr = sc.my_addr.s_addr;


if (bind(socketno, (LPSOCKADDR)&hostdata, sizeof(hostdata)) != SOCK_OK) // 바인드

{

Sockerror(ERROR_BIND);

return(SOCK_NG);

}


aj71e71.sin_family = AF_INET; // PLC 쪽 Socket 구조체 정의 

aj71e71.sin_port = sc.aj_port; // PLC 쪽 Port No, IP Address

aj71e71.sin_addr.s_addr = sc.aj_addr.s_addr;

// --------------- 커넥트(Active 오픈 요구) ---------------- //

result = connect(socketno, (LPSOCKADDR)&aj71e71, sizeof(aj71e71));


/*if (connect(socketno, (LPSOCKADDR)&aj71e71, sizeof(aj71e71)) != SOCK_OK)

{

Sockerror(ERROR_CONNECT);

return(SOCK_NG);

printf("AJ_test Start4\n");

}*/


if (result == 0)

{

printf("Connect OK\n");

}

else if (result == SOCKET_ERROR)

{

printf("Connect FAIL\n");

}


Closeflag = FLAG_ON; // 커넥션 종료 플래그 ON


// ----------------이 부분까지 Ethernet과 PLC 연결 부분 ----------------- //


// --------------- D0 ~ D4 일괄 쓰기 요구 ----------------- //

// 송신 데이터를 보내면 " 수신할 수 없습니다, 에러 코드는 0입니다 " 라는 

// 메세지가 나옴 

///*

strcpy(s_buf, "500000FF03FF00002C000A14010000D*0000000005112233445566778899AA");


length = strlen(s_buf);

if (send(socketno, s_buf, length, 0) == SOCKET_ERROR) // 데이터 송신 

{

Sockerror(ERROR_SEND);

return(SOCK_NG);

}

printf("\n 송신 데이터 \n%s\n", s_buf);


length = recv(socketno, r_buf, BUF_SIZE, 0); // 응답 데이터 수신 


if (length = SOCKET_ERROR)

{

Sockerror(ERROR_RECEIVE);

return(SOCK_NG);

}


//r_buf[length] = '\0'; // 수신 데이터 끝에 NULL을 세트


printf("\n 수신 데이터 \n%s\n", r_buf);

//*/

// 위의 부분을 주석 처리후 밑의 읽기 요구는 수신 Data가 들어옴 


// --------------- D0 ~ D4 일괄 읽기 요구 ----------------- //

strcpy(s_buf, "50000FF03FF000018000A04010000D*0000000005");


length = strlen(s_buf);


if (send(socketno, s_buf, length, 0) == SOCKET_ERROR) // 데이터 송신 

{

Sockerror(ERROR_SEND);

return(SOCK_NG);

}


printf("\n 송신 데이터 \n%s\n", s_buf);


length = recv(socketno, r_buf, BUF_SIZE, 0); // 응답 데이터 수신 


if (length == SOCKET_ERROR)

{

Sockerror(ERROR_RECEIVE);

return(SOCK_NG);

}


//r_buf[length] = '\0'; // 수신 데이터의 끝에 NULL을 세트 


printf("\n 수신 데이터 : \n%s\n", r_buf);


if (shutdown(socketno, 2) != SOCK_OK) // 송신 금지 처리 

{

Sockerror(ERROR_SHUTDOWN);

return(SOCK_NG);

}


if (closesocket(socketno) != SOCK_OK)

{

Sockerror(ERROR_CLOSE);

return(SOCK_NG);

}


Closeflag = FLAG_OFF; // 커넥션 종료 플래그 OFF

WSACleanup(); // Winsock.DLL 해제


printf("\nAJ_test End. \n\n 정상 완료했습니다. \n");

printf(" 프로그램을 종료하였습니다, 아무 키나 누르십시오.\n");

Dmykeyin = getchar(); // 키 입력 대기

return(SOCK_OK);

}


void Sockerror(int error_kind) // 에러 처리 함수 

{

if (error_kind == ERROR_INITIAL)

{

printf(" 초기화 처리가 이상합니다.");

}

else

{

nErrorStatus = WSAGetLastError();


switch(error_kind)

{

case ERROR_SOCKET:

printf("소켓을 작성할 수 없습니다.");

break;

case ERROR_BIND:

printf("바인드할 수 없습니다.");

break;

case ERROR_CONNECT:

printf("커넥션을 확립할 수 없습니다.");

break;

case ERROR_SEND:

printf("송신할 수 없습니다.");

break;

case ERROR_RECEIVE:

printf("수신할 수 없습니다.");

break;

case ERROR_SHUTDOWN:

printf("Shutdown할 수 없습니다.");

break;

case ERROR_CLOSE:

printf("정상 클로즈 할 수 없습니다.");

break;

}

}


printf("에러 코드는 %d입니다. \n", nErrorStatus);


if (Closeflag == FLAG_ON)

{

nErrorStatus = shutdown(socketno, 2); // 셧다운 처리 

nErrorStatus = closesocket(socketno); // 클로즈 처리 

Closeflag = FLAG_OFF; // 커넥션 종료 플래그 OFF

}


printf("프로그램을 종료했습니다.아무키나 누르십시오.\n");

Dmykeyin = getchar();

WSACleanup();

return;

}



사업자 정보 표시
가나소프트 | 김용유 | 충남 천안시 동남구 목천읍 서리2길 42-1 | 사업자 등록번호 : 312-33-14797 | TEL : 070-8659-0316 | Mail : yykim@gana-soft.com | 통신판매신고번호 : 12390123호 | 사이버몰의 이용약관 바로가기

* 인터넷쇼핑몰에 사업자로 가입하기


인터넷마트에 보면 구매사업자로 가입이 가능하다.(G마.. 11.. 옥...)

여기에서 사업자등록증에 내용을 가지고 가입을 한후 현금으로 구매를 할 경우 세금계산서가 내 사업자 앞으로 발행이 가능하다.

물론 카드로 구매시에는 세금계산서는 발행 되지 않는다.(카드도 현금영수증 사이트에 가입되어 있으면 추후에 정산이 가능하다.)

사업자 등록증이 나오지 않았을경우에는 개인주민번호로 세금계산서를 발행해 달라고 하면 추후 사업자등록증이 나온 후 정산이 가능하다는 것도 알아두도록 하자.


사업 초기에 여기저기 살 물건들이 많이 생기게되기 마련이다. 첫해에 물건을 많이 사서 적자를 보고 세금 폭탄까지 맞지 않으려면 초기에 대비를 잘해야만 할 것이다.


저와 같이 사업을 처음 시작하시는 분들에게 도움이 될 수 있을까해서 이렇게 메모식으로라도 창업기를 남기는 중...

사업자 정보 표시
가나소프트 | 김용유 | 충남 천안시 동남구 목천읍 서리2길 42-1 | 사업자 등록번호 : 312-33-14797 | TEL : 070-8659-0316 | Mail : yykim@gana-soft.com | 통신판매신고번호 : 12390123호 | 사이버몰의 이용약관 바로가기

* 사업자용 범용 인증서 발급받기


은행거래를 틀고 오면서 공인 인증서를 신규로 받아야만 했다. 

기존의 개인범용 공인 인증서가 있었지만, 모든 업무를 다 처리하기에는 그것만으로는 부족하기에 10만(부가세제외)짜리 인증서를 구매하기로 했다.


기업용 사이트로 들어가서 인증서 등록화면에서 신규 인증서를 10만원짜리로 변경후 받으면 된다.

당연히 결제를 위해서는 사업자용 통장에 돈이 들어가 있어야만 한다.


이렇게 하지 않을 경우 각 인증사이트에 들어가서 서류를 제출한 후 받으면 된다.. 그냥 은행가서 계좌 계설하고 받는 편이 좀더 편한듯...


아직 정부쪽 조달을 받지 않을 예정이지만, 정부쪽 일을 하게 된다면 지문쪽 보안도 추가해야 한다.. 이경우 7만원짜리 지문 인식용 모듈도 구매해야만 한다.. 정부 인증이 필요해 본사 방문도 필요한듯 하던데.. 이 부분은 추후 조달청 일을 한다면 추가해야지..



* 현금 영수증 사이트에 사업자용 카드 등록하기..

현금 영수증 사이트에 기업용으로 가입을 하자.. 위에서 받은 인증서가 있으면 좀 더 편리함..

기업용으로 가입하고 현금 영수증 카드도 신청하자..


그리고, 현재 사용하고 있는 카드를 추가로 등록해 추후에 개인 카드를 사용한 부분을 공제 받도록 하자.

참고로 이번달에 등록한 내용은 다음달 1일 기준으로 갱신되어 15일부터 반영된다고 하니 참고해두자..


그리고, 각 카드사나 은행에 보면 개인사업자용 카드들이 있으니, 한두개 정도는 가입해서 사용하는 것도 세금 걱정에서 조금은 덜 수 있을 듯 하다..

개인 사업자는 개인 신용으로 한도가 잡히므로 참고해 카드를 개설해야 할 것이다.


그리고, 현금 영수증 사이트에 등록되지 않은 카드는 꼭 수령과 동시에 등록하도록 하자.

참고로, 현금 영수증 카드에는 신용카드와 체크카드가 등록 가능하며, 사업주 본인 카드만 가능함을 꼭 알아두도록 하자.

사업자 정보 표시
가나소프트 | 김용유 | 충남 천안시 동남구 목천읍 서리2길 42-1 | 사업자 등록번호 : 312-33-14797 | TEL : 070-8659-0316 | Mail : yykim@gana-soft.com | 통신판매신고번호 : 12390123호 | 사이버몰의 이용약관 바로가기

지난 10월 1일부터 타의반 자의반 백수가 되었다..


근 50일을 쉬면서 여러가지 생각을 하게 되었다.. 취업이냐.. 창업이냐...


그러면서 내린 결론은 창업이다..

사업자 정보 표시
가나소프트 | 김용유 | 충남 천안시 동남구 목천읍 서리2길 42-1 | 사업자 등록번호 : 312-33-14797 | TEL : 070-8659-0316 | Mail : yykim@gana-soft.com | 통신판매신고번호 : 12390123호 | 사이버몰의 이용약관 바로가기
  1. 자의반.. 타의반...으로...

    12월 8일에 사업자등록 신고...

    12월 9일에 사업자등록 완료..

    이제 진짜로 시작이다..

+ Recent posts