=== UDP 서버
#include "stdafx.h"
#pragma comment(lib, "ws2_32.lib")
#include <winsock2.h>
#include <stdio.h>

#define PORT 65000
#define BUFMAX 255

struct dataStruct
{
    int intValue;
    char charValue[100];
    float floatValue;
};

void ErrorMessage(char *errorMessage)  /* External error handling function */
{
    printf("%s\n", errorMessage);
    exit(1);
}

int _tmain(int argc, _TCHAR* argv[])
{
    WSADATA wsaData;               

    SOCKET sock;
    SOCKADDR_IN echoServAddr;
    SOCKADDR_IN echoClntAddr;
                        
    if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0) /* Load Winsock 2.0 DLL */
    {
        fprintf(stderr, "WSAStartup() failed");
        exit(1);
    }

    /* Create socket for sending/receiving datagrams */
    if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
        ErrorMessage("socket() failed");

    /* Construct local address structure */
    memset(&echoServAddr, 0, sizeof(echoServAddr));
    echoServAddr.sin_family = AF_INET;
    echoServAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    echoServAddr.sin_port = htons(PORT);

    /* Bind to the local address */
    if (bind(sock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) != 0)
        ErrorMessage("bind() failed");

    for (;;) /* Run forever */
    {
        char echoBuffer[BUFMAX];
        int cliLen = sizeof(echoClntAddr);
        int recvMsgSize = recvfrom(sock, echoBuffer, BUFMAX, 0, (struct sockaddr*) &echoClntAddr, &cliLen);
        if (recvMsgSize < 0)
            ErrorMessage("recvfrom() failed");

        dataStruct recvData;
        memcpy(&recvData, echoBuffer, sizeof(recvData));
        printf("RecvData - %d, %s, %f\n", recvData.intValue, recvData.charValue, recvData.floatValue);

        dataStruct sendData;
        ZeroMemory(&sendData, sizeof(sendData));
        sendData.intValue = 101;
        sprintf(sendData.charValue, "잘받음");
        sendData.floatValue = 12.11f;

        char sendBuf[BUFMAX];
        ZeroMemory(sendBuf, sizeof(sendBuf));
        memcpy(sendBuf, &sendData, sizeof(sendData));

        if (sendto(sock, sendBuf, sizeof(sendData), 0, (struct sockaddr *) &echoClntAddr, sizeof(echoClntAddr)) == 0)
        {
            ErrorMessage("sendto() send Error");
        }
    }

    return 0;
}
=== php 클라이언트
<?php
    class CDataClass
    {
        private $intValue;
        private $charValue;
        private $floatValue;
       
        public function SetDataInt($int)
        {
            $this->intValue = $int;
        }
       
        public function &GetDataInt()
        {
            return $this->intValue;
        }
       
        public function SetDataChar($char)
        {
            $this->charValue = $char;
        }
       
        public function &GetDataChar()
        {
            return $this->charValue;
        }
       
        public function SetDataFloat($float)
        {
            $this->floatValue = $float;
        }
       
        public function &GetDataFloat()
        {
            return $this->floatValue;
        }
       
        public function PackData()
        {
            $temp = pack("i", $this->intValue);
            $temp .= pack("a100", $this->charValue);
            $temp .= pack("f", $this->floatValue);

            return $temp;
        }
       
        public function UnpackData($value)
        {
            $array = unpack("iInt/a100Char/fFloat", $value);
           
            $this->intValue = $array[Int];
            $this->charValue = $array[Char];
            $this->floatValue = $array[Float];
        }
    }

define("_IP",    "127.0.0.1");
define("_PORT",  "65000");

$sendData = new CDataClass();
$sendData->SetDataInt(100);
$sendData->SetDataChar("아햏햏");
$sendData->SetDataFloat(10.1);

$temp1 = $sendData->GetDataInt();
$temp2 = $sendData->GetDataChar();
$temp3 = $sendData->GetDataFloat();
echo "CLIENT >> send Data - $temp1 , $temp2 , $temp3 
"; $sendbuf = $sendData->PackData(); $sendlen = strlen($sendbuf); $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); socket_sendto($sock, $sendbuf, $sendlen, 0, _IP, _PORT); $from = ''; $port = 0; $recvSize = socket_recvfrom($sock, $buf, 4096, 0, $from, $port); $recvData = new CDataClass(); $recvData->UnpackData($buf); $temp1 = $recvData->GetDataInt(); $temp2 = $recvData->GetDataChar(); $temp3 = $recvData->GetDataFloat(); socket_close($sock); echo "CLIENT >> recv Data - $temp1 , $temp2 , $temp3
"; ?>
by 널부러 2013. 10. 1. 18:46
#include "stdafx.h"

#include <iostream>
#include <regex>
#include <fstream>

#include "errorDefine.h"

int _tmain(int argc, _TCHAR* argv[])
{
    std::ifstream openFile;
    openFile.open("errorDefine.h");

    if( !openFile.is_open() )
    {
        return 0;
    }
   
    // 파싱할 내용
    std::regex startEndRegex( "[{}]" );
    std::regex indexRegex ("(-?[0-9]+),[^0-9]");
    std::regex defineRegex ("[0-9a-zA-Z_]+");
    std::regex logMessageRegex("// ");

    int index = 0;
    bool startPrint = false;
    while( openFile.good() )
    {
        std::string stringLine;
        std::string defineString;
        std::string logMessage;

        std::smatch indexMatch;
        std::smatch defineMatch;
        std::smatch logMessageMatch;
        std::smatch startEndMatch;

        // 파일 읽기
        std::getline( openFile, stringLine );

        // 공백 체크
        stringLine.erase( stringLine.find_last_not_of(' ') + 1 );
        if( 0 == stringLine.length()  )
            continue;
       
        // 시작 끝 체크
        if( true == std::regex_search(stringLine, startEndMatch, startEndRegex) )
        {
            startPrint = !startPrint;
            continue;
        }

        // 출력 여부 확인
        if( false == startPrint )
            continue;
   
        // define 인덱스 출력
        std::regex_search(stringLine,indexMatch,indexRegex);
        if( !indexMatch.empty() )
        {   
            std::string tempIndex = indexMatch[0];
            index = atoi( tempIndex.c_str() );
        }
        else
        {
            index++;
        }

        // define Name
        std::regex_search(stringLine, defineMatch, defineRegex);
        if( !defineMatch.empty() )
        {
            defineString = defineMatch[0];
        }

        // define 메시지
        std::regex_search(stringLine, logMessageMatch,logMessageRegex);
        if( !logMessageMatch.empty()  )
        {
            logMessage = logMessageMatch[0].second._Ptr;
        }
        else
        {
            logMessage = "***메시지가 없음 추가요망";
        }

        // 출력
        printf("index : %5d - defineName : %s - message : %s\n", index, defineString.c_str(), logMessage.c_str() );
    }

    return 0;
}
=== errorDefine.h
enum errorType
{
    RESULT_FAIL = -1,       // 에러
    RESULT_OK,              // 정상

    ERROR_1,                // 에러 메시지 출력(1번이에용)
    ERROR_2,                // 에러 메시지 출력(2번이에용)
    ERROR_3,           	    //
    ERROR_4 = 100,          // 중간에 변경된 번호야

    ERROR_TYPE_MAX,         // 에러 번호 끝
};
by 널부러 2013. 5. 3. 18:41

boost에서 xml, ini, json, info 확장자 파일을 쉽게 파싱 할수 있는데 그것이  property_tree ...

그중에서 젤 많이 쓰는 ini 파일 파싱 하는 코드를 올려본다.

- test.ini 파일 내용

[Section]
Value1 = text_string
Value2 = 10

- 소스 코드

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/ini_parser.hpp>

int _tmain(int argc, _TCHAR* argv[])
{
	// ptree 선언
	boost::property_tree::ptree pt;

	// 파일 읽어오기 
	boost::property_tree::ini_parser::read_ini( "test.ini", pt );
	
	// 문자열 읽기
	std::string value1 = pt.get<std::string>("Section.Value1");

	// 숫자 읽기 
	int value2 = pt.get<int>("Section.Value2");

	return 0;
}



by 널부러 2013. 4. 22. 15:02