반응형


DataTable을 Socket으로 전송해야하는 상황이 발생..

DataTable을 Byte로 변환 해야 하는데 그 방법을 찾이 못하였고..(아시는분은 댓글좀...)

DataSet을 Byte로 압축, 변환 시키는 방법을 찾았다.

테스트 및 적용 완료 하였고 잘 돌아간다.

진행 중 문제가 있었는데, 받는 측에서 Buffer를 너무 크게 해서 받으면 DataSet으로 변환이 되지 않는다.

정확한 사이즈를 받아와야 한다.


출처 : http://ndolson.com/479#recentTrackback


매우 효율적인 방법인 듯..


설명은 출처에 잘 되어 있으므로 생략하겠다.


반응형
반응형

DataSet을 Byte로 변환하여 보낼일이 생겼다.

그런데.. DataSet의 크기가 크다. 

문제가 또 생긴 것이 Byte로 받은 측에서 DataSet으로 변경할 때 생긴다.

버퍼 크기대로 받으면. DataSet으로 변경이 안되기 때문이다.

그래서 DataSet의 크기를 먼저 보낸 후 그 사이즈와 버퍼 사이즈를 비교하여 반복적으로 받는 방법이다.


출처 : http://it-jerryfamily.tistory.com/entry/ProgramSocket-%ED%86%B5%EC%8B%A0-%EB%B2%84%ED%8D%BC-%EC%82%AC%EC%9D%B4%EC%A6%88%EB%B3%B4%EB%8B%A4-%EB%A7%8E%EC%9D%80-%EC%96%91%EC%9D%98-%EB%8D%B0%EC%9D%B4%ED%83%80%EB%A5%BC-%EB%B0%9B%EC%9D%84-%EC%8B%9C



위의 출처로 가면 소스가 나와 있다.



주요 부분만 설명.


서버 (받는 측)


 private void btnListen_Click(object sender, EventArgs e)
    {
        sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
 
        sck.Bind(new IPEndPoint(0, 8));
        sck.Listen(0);
 
        acc = sck.Accept();
 
        sck.Close();
 
        new Thread(() =>
        {
            while(true)
            {
                try
                {
///////// 받을 Data의 크기를 먼저 알아온다.
                    byte[] sizeBuf = new byte[4];
 
                    acc.Receive(sizeBuf, 0, sizeBuf.Length, 0);
 
                    int size = BitConverter.ToInt32(sizeBuf, 0);
//////// 데이터를 반복적으로 가져 올때 Stream에다가 저장 한다.
                    MemoryStream ms = new MemoryStream();
                     
/////// 받을 Data의 크기와 버퍼 사이즈를 비교하면서 데이터를 받아 온다.
                    while (size > 0)
                    {
                        byte[] buffer;
                        if (size < acc.ReceiveBufferSize)
                            buffer = new byte[size];
                        else
                            buffer = new byte[acc.ReceiveBufferSize];
 
                        int rec = acc.Receive(buffer, 0, buffer.Length, 0);
 
                        size -= rec;
 
                        ms.Write(buffer, 0, buffer.Length);
                    }
 
                    ms.Close();
 
                    byte[] data = ms.ToArray();
 
                    ms.Dispose();
 
                    Invoke((MethodInvoker)delegate
                    {
                        richTextBox1.Text = Encoding.UTF8.GetString(data);
                    });
                }
                catch
                {
                    MessageBox.Show("서버: DISCONNECTION!");
                    acc.Close();
                    acc.Dispose();
                    break;
                }
            }
            Application.Exit();
        }).Start();
    }


클라이언트 (보내는 측)


private void btnSendText_Click(object sender, EventArgs e)
{
    byte[] data = Encoding.UTF8.GetBytes(richTextBox1.Text);
     //보낼 데이터의 크기를 먼저 보낸다.
    sck.Send(BitConverter.GetBytes(data.Length), 0, 4, 0);
//데이터를 보낸다.
    sck.Send(data);
}


반응형
반응형

수십개의 Sensor와 데이터를 주고 받아야 하는데 Server 입장이 아니라 Clinet로 Telnet 접속을 시켜줘야 하는 상황.

각자 다른 Interval로 접속해서 Data를 받아와야 해서 처음에는 Thread를 사용해서 Sleep을 쓸 생각이었으나...

이렇게 되면 일정 간격으로 log를 남길 수가 없다는 판단... 세션이 늘어날수록 지연될수도 있다는 의견..


그래서 Timer를 써야 하는데 인자 전달하는 방법을 찾아야 했다........




우선.. Timer가 3가지가 있다는... ?


1.System.Windows.Forms.Timer

2.System.Threading.Timer

3.System.Timers.Timer


출처 : http://blog.daum.net/starkcb/117


출처에 가보면 상세한 설명이 나와있음....


그러나 인자 보내는 방법이 없네 ?




그래서 더 찾아보니 방법이 있었다.


출처 : http://blog.naver.com/PostView.nhn?blogId=bluekms21&logNo=10177193993


자세히는 아니더라도 사용방법이 나왔다.

나는 System.Threading.Timer 를 사용해서 인자를 넘기는 방법으로 Timer를 생성할 것이다.


아래 부분은 위의 출처에서 가져온 내가 필요한 부분이다. 해보고 예제를 추가해보도록 하겠다...



System.Threading.Timer

역시 Thread가 짱짱맨이시다. 객체별로 다른 인자값을 넣어줘도 잘 돌아갔다.

인자값의 전달은 생성자의 2번째 인자에 object형으로 넣어주면 된다.

 

System.Threading.Timer timer = new System.Threading.Timer( proc, (object)value, 1000, 1000);

 

1) proc

System.Threading.TimerCallback 으로 인자로 object를 받고, 반환값이 void인 델리게이터이다.

 

2) (object)value

구지 캐스팅을 해주지 않아도 된다. (모든 객체는 object이므로...)

실행될 메서드에서 원래 집어넣었던 형태로 다시 캐스팅해서 사용하면 된다.

 

public void proc( object state )

{

    Console.WriteLine( (string)state );

}

 

3) 1000, 1000

시작전 대기시간과 간격이다. 3번째 인자값을 0으로 주면 즉시 실행하게 되는데

MSDN의 예제에도 10 ~ 1000 정도는 주고있는데 쓰레드가 다 완성된 뒤 시작하게 하려는 의도가 숨어있다.

Threading.Timer의 실행을 멈추려면

timer.Change( System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite ); 로 설정한다.

 


요건.. 내가 만든 예제, 조금 느린 감이 있긴한데... 흠.... 타이머를 다르게 가져가면 잘 안되는 듯 한데...


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading;

using System.Threading.Tasks;


namespace ConsoleApplication1

{

    class Program

    {

        static void Main(string[] args)

        {

            string value = "test";

            List<Timer> TimerList = new List<Timer>();

            for(int i = 1; i< 10; i++)

                TimerList.Add(new Timer(proc, (object)(value+i), 1000, 1000));


            Thread.Sleep(20000);

        }


        private static void proc(object state)

        {

            Console.WriteLine((string)state);

        }

    }

}























반응형
반응형

Socket 통신으로 Client가 Server에게 요청하는 Packet을 보내는데

명령을 한번에 보내기 위해서는 Server측에서 받아서 문자열을 자르는 방법이 필요..



상황


Login 요청 패킷을 보낼 예정이었는데...


Client가 Server측에게 


"[LOG]ID:test,PW:1234" 라고 보낼 예정.



우선 LOG 문자열 추출


string str = "[LOG]ID:test,PW:1234";

Console.WriteLine(str.Substring(1,3));


결과



이번엔 [LOG]를 제외한 뒷부분 부터 자르기


string str = "[LOG]ID:test,PW:1234";

Console.WriteLine(str.Substring(5));


결과




위의 문자열을 ","를 기준으로 ID와 PW로 나누려고 한다..

Split을 사용


string str = "ID:test,PW:1234";

string[] sp =  str.Split(',');

foreach(string s in sp)

{

Console.WriteLine(s);

}


결과















반응형
반응형

목적 :  로그인 중 대기 시간동안 뜨게 하기 위해서 사용.


사용한 컨트롤 : Progress Bar, Timer

기능 : Progress Bar로 프로그램이 동작 중이라는 것을 표시.

        Timer 를 실행 시켜서 일정 시간 후 ProgressBar가 사라지고 Login 완료.




using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;


namespace SensorManagement.Login

{

    public partial class ProgressBar : Form

    {

        private int timerCount = 0;


        public ProgressBar()

        {

            InitializeComponent();

        }


        private void ProgressBar_Load(object sender, EventArgs e)

        {

            progressBar1.Style = ProgressBarStyle.Marquee;  // style은 continuous, blocks를 줄 수 있다. 

            progressBar1.Minimum = 0;

            progressBar1.Maximum = 100;

            progressBar1.Step = 1;

            progressBar1.Value = 0;

            timer1.Start();  //timer Start를 해주어야 Event가 발생한다.

        }


        private void timer1_Tick(object sender, EventArgs e)

        {

            label1.Text += ".";

            if(++timerCount ==5)

            {

                timer1.Stop();

                progressBar1.Enabled = false;

                this.Close();

            }

        }

    }

}




[결과]



반응형
반응형

프로젝트 진행 중 C#을 사용하게 되어 모든 기능을 C#으로 변경이 필요..


ini 파일 관련 API는 이미 정리를 해두었으므로 사용법만 보도록 하겠다.



[C# 적용 코드]


[결과]







반응형
반응형

레지스터 내용부터 읽어보자

info reg | info registers

모든 레지스터 정보를 얻을 수 있다.


1개, 또는 여러개의 레지스터 정보를 얻길 원한다면

info reg 레지스터 이름1,이름2,이름3 ...

이런식으로 하면 된다

이제 레지스터의 정보를 확인 할수 있다.


그렇담.. 메모리 내용을 확인해 보자.

스택이라던지 데이터영역에 잇는 내용을 알고 싶을때 어떻게 할까 ?

x/nfu 주소   이 형식을 이용한 명령을 내리면 된다


n: 반복 갯수

f(format) 

i(명령코드) x(16진수) o(8진수) t(2진수)  d(부호 있는 10진수)   u(부호없는 10진수) s(문자열)

u(unit)

b(1바이트) h(2바이트) w(4바이트)

이렇게만 써놓으면 이해가 안가므로 실습을 해봐야겠지

비교해가면서 확인을 해보겠습니다

우선 반복갯수

4번 8번 5번의 반복

차이가 보이죠 ?


이제는 포맷

i(명령코드) 포맷은 u의 크기에 상관 없이 같은 결과가 나오며 생략해도 됩니다


확인 되시죠?

이제 다른 포맷을 확인해 봅시다.

같은 주소의 메모리를 읽어 오는데 포맷에 의해 다르게 내용이 표시되는 것을 볼 수 잇다

모두 같은 값을 읽어 온 것이지만 어떤 포맷을 스냐에 따라 보여지는게 달라 보일 수 있다


이제 마지막으로 unit ...


몇 바이트 단위로 읽어 낼 것인지에 대해 설정하는 것이다

휴... 기초 사용법 끝




반응형

'ETC > Linux' 카테고리의 다른 글

make 유틸리티  (0) 2016.09.30
vi 에디터  (0) 2016.09.30
gdb 기초 사용법2(stepi nexti 차이점)  (0) 2015.09.16
gdb 기초 사용법  (0) 2015.09.15
gcc 컴파일  (0) 2015.09.15
반응형

nexti 와 stepi 차이를 예문을 통해 알아보도록 하겠다

우선 call 을 하는 부분이 있어야 하므로 함수를 하나 정의 하고

그 부분에서 어떻게 디버깅이 진행되는지 살펴보자


이제 컴파일 후 gdb로 실행을 해보도록 하겠다

intel 로 어셈블리어를 바꾸고

main함수쪽을 확인해 보았다.

function으로 call 하는 부분이 보인다.

main+40 (0x08048403) 이부분이다

여기를 브레이크 포인트로 잡고 런을 한 후 nexti와 step의 차이를 보도록 하자

call 하는 부분에 멈췄다.

nexti 를 먼저 확인해 보자

nexti를 하자 call을 따라 가는 것이 아니라 다음 명령으로 넘어간 것을 볼 수 있다

nexti명령 하나로 call을 실행시키고 넘어간 것이다.

그럼 stepi를 확인해 보자


stepi 는 call 한 명령어를 따라가서 수행하는 것을 볼 수 있다.

이러한 차이점을 가지고잇다... 오호...


printf한 부분이 어떻게 나오는지도 한번 확인해 보자

printf 실행 부분에 breakpoint를 설정한 후

c명령어(continue)를 사용하여 진행한다

ni명령어를 쓰면 printf가 실행되고 30이 출력되는것을 볼 수 있다.

si명령어였다면 어떻게 될지 상상이 된다면 두 명령어의 차이점을 이해한 것이다.




반응형

'ETC > Linux' 카테고리의 다른 글

make 유틸리티  (0) 2016.09.30
vi 에디터  (0) 2016.09.30
gdb 기초 사용법 (메모리, 레지스터 내용 읽기)  (0) 2015.09.16
gdb 기초 사용법  (0) 2015.09.15
gcc 컴파일  (0) 2015.09.15
반응형

gdb를 사용해야 할 일이 많아서 내가 사용하기에 맞게끔 정리를 해야겠다

인터넷을 뒤지다 보면 컴파일할때부터 gcc -g 옵션을 가지고 컴파일한 파일 위주로 설명이 되어 있다

나는 그렇게 컴파일한 파일을 디버깅 하려고 쓰는게 아니기 때문에 내가 하나씩 해보면서

정리를 하겠다.

인터넷에는 의외로 쓸모 없는 정보들이 참 많다.. ㅠㅠㅠ ,, 참고로 이글은 초보만 보기를..


1. gdb 실행

gdb 명령을 통해 들어가고 quit 를 통해 나갈 수 있다.


원하는 프로그램을 gdb로 실행하려면

gdb [프로그램 명]   으로 하면 되는데 다른 옵션들도 있으나 내가 필요한건 일단 이 명령이므로

이거에 대해서만 다룰거다


이거 네모 어떻게 그리는거지....

아무튼 test 파일을 gdb로 실행했다.


-프로그램 시작

run 명령을 통해서 시작을 햇다가 끝이 난다.

break point가 없어서 그런것이므로... 일단은 이렇게 시작한다는 것을 알면 되겠다.



2. disassemble

윈도우에서 사용하는 디버거를 사용해봤다면 어셈블리어로 디버깅 하는 것을 원했을지도 모른다

내가 그랬으니까.

찾다 찾다 내가 쓰는거다.

어셈블리어로 보면서 디버깅을 해보자

disassemble 주소

disassemble main

메인 함수에 대해 어셈블리어로 표현해 준다.

뒤에 주소를 써도 된다.

disassemble 이라고 전부다 치기 어렵다면 disas 정도까지만 치고 TAB키를 누르면 자동 완성된다. 편하다


x/명령수i 주소

무슨 뜻인지 이해가 되겠나 ?

x/3i 3줄을 표시하라는 뜻이다. 이또한 main 말고 0x8048394 를 넣어도 같은 결과를 낼 수 있다.


어셈블리어 문법

AT&T VS Intel 문법

두 분법에 차이가 있다.

쉽게 정리해 놓은게 있어서 출처를 남기고 

출처 : http://huammmm1.tistory.com/492

1. 레지스터를 나타낼 때


intel : eax


AT&T : %eax



2. operand 순서


intel : destination, source


AT&T : source, destination



3. 상수


intel : 5로 표기


AT&T : $5로 표기



4. 메모리 주소 참조


intel : [eax]


AT&T : (%eax)



5. 레지스터 + offset 위치의 메모리 주소를 참조할 때


intel : [eax + 4]


AT&T : 4(%eax)


이러한 차이점이 있는데... 나는 intel로 된게 좋다.... 그래서 바꿔 보겠다

set disassembly-flavor intel 
이렇게 쓰면 된다.

기호에 맞게 취향에 맞게 사용하면 된다. 난 이게 편하다...


3. breakpoint

처음에 run을 했을때 시작했다가 그냥 끝나는 것을 보았다.

이제는 breakpoint를 설정해서 그 부분에서 정지 하도록 해보자

break *main+3 

이런 식으로 브레이크 포인트를 지정하면 된다.

어디가 지정되어 있나 확인할때는

info break 명령을 하면 된다


슬슬 길어 진다... 이런식으로 하면 된다...

4. netxi stepi

이제 명령을 한줄씩 실행하는것을 알아보도록 할 거다...

이거까지만 쓰고 다음 글에 이어서 쓰도록 해야 겠다.

break point를 지정하고 run을 하면 거기서 멈춘다

그런데 나는 한줄 씩 보기를 원한다면...

계속 break point를 지정해주면서 확인할 것인가?

그래서 있는 명령어가 nexti 와 stepi 이다.

nexti는 단축으로 ni 

stepi 는 si 이다. 간편하다

브레이크 포인트 적용한 곳으로부터 한 명령씩 진행하는 것을 볼 수 있다.

stepi와 nexti의 차이점이라면...

stepi는 하위 함수를 따라간다. call이 있으면 그 주소로 따라가서 진행한다

그러나 nexti는 따라가지 않고 call이 진행되고 다음줄로 넘어간다.

이거는 다음에 해보면서 정리하도록 하자.





반응형

'ETC > Linux' 카테고리의 다른 글

make 유틸리티  (0) 2016.09.30
vi 에디터  (0) 2016.09.30
gdb 기초 사용법 (메모리, 레지스터 내용 읽기)  (0) 2015.09.16
gdb 기초 사용법2(stepi nexti 차이점)  (0) 2015.09.16
gcc 컴파일  (0) 2015.09.15
반응형

gcc 컴파일에 대해 간략히 알아봐야겠다.

gcc는 c프로그래밍을 컴파일 해주는 녀석이다.

자주쓰지 않아서 헷갈렸는데 이제는 쓸일이 좀 생겨서

정리를 하면서 공부를 해야겠다


우선 gcc --help 로 어떻게 사용하는지 볼까나


옵션을 써도되고 안써도 되네요

옵션 없이 사용해 보도록 하겠습니다.

우선 test.c로 간단한 c프로그래밍을 해보죠

디렉토리에는 test.c 밖에 없고 위에 보이는것처럼 코딩을 했습니다.

이제 옵션없이 gcc를 사용해 보겠습니다.

gcc test.c 명령어를 치자 a.out 이라는 파일이 생성되었습니다.

옵션 없이 사용하면 a.out 으로 자동으로 컴파일을 해줍니다.

실행을 해보죠

test.c 로 프로그래밍한 결과입니다. 


그럼 자주 쓰는 몇개의 옵션을 볼까요

버전을 확인하는 gcc --version, -v 로 해도 버전을 알아볼 수 잇습니다.


컴파일할 파일명을 지정 해주는 gcc -o [파일명] 

test라는 파일이 생긴것을 확인 할수 잇죠




일단은 기본 사용법은 이정도니까... 다른 옵션은 사용하게 될때마다 업뎃 하는걸로다가...




반응형

'ETC > Linux' 카테고리의 다른 글

make 유틸리티  (0) 2016.09.30
vi 에디터  (0) 2016.09.30
gdb 기초 사용법 (메모리, 레지스터 내용 읽기)  (0) 2015.09.16
gdb 기초 사용법2(stepi nexti 차이점)  (0) 2015.09.16
gdb 기초 사용법  (0) 2015.09.15

+ Recent posts