티스토리 뷰

1부 : 윈도우즈 MFC 소켓프로그래밍 : 소켓 기본 클래스 소스코드 1 (헤더파일)

http://andrew0409.tistory.com/97


2부 : 윈도우즈 MFC 소켓프로그래밍 : 소켓 기본 클래스 소스코드 2 (서버cpp파일)

http://andrew0409.tistory.com/99


3부 : 윈도우즈 MFC 소켓프로그래밍 : 소켓 기본 클래스 소스코드 3 (클라이언트cpp파일)

http://andrew0409.tistory.com/100


4부 : 윈도우즈 MFC 소켓프로그래밍 : 소켓 기본 클래스 소스코드 4 (메인cpp파일)


어제 서버쪽 메인 cpp 파일을 올려놓고 클라이언트쪽 코드를 안올렸구나 하는 생각이 문득 들었다.

그래서 뒤늦게 올림...ㅋㅋ


서버쪽 코드를 이해하고 있다면 클라이언트를 짜는것은 일도 아니다. 따라서 간단하게만 설명을 덧붙이겠다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void CChildView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
    if (nChar != VK_RETURN)
        return;
 
    if (mClient.IsValid() == true)
        return;
 
    if (mClient.Create() == false)
    {
        MessageBox(L"소켓을 생성할 수 없습니다.", L"에러", MB_ICONERROR);
        return;
    }
 
    if (mClient.Connect("127.0.0.1"26000== false)
    {
        MessageBox(L"서버에 연결할 수 없습니다.", L"에러", MB_ICONERROR);
        return;
    }
 
    MessageBox(L"연결했습니다.", L"성공", MB_ICONINFORMATION);
}
cs

서버와 마찬가지로 엔터키를 누르면 연결이 되도록 KeyDown 메세지를 처리했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
void CChildView::OnLButtonDown(UINT nFlags, CPoint point)
{
    mCurrent = new std::vector < CPoint > ;
    mCurrent->push_back(point);
 
    if (mClient.IsValid() == true)
    {
        int header = DRAW_START;
        mClient.Send((const char *)&header, sizeof(header));
        mClient.Send((const char *)&point, sizeof(point));
    }
}
 
 
void CChildView::OnLButtonUp(UINT nFlags, CPoint point)
{
    mPath.push_back(mCurrent);;
    mCurrent = nullptr;
 
    if (mClient.IsValid() == true)
    {
        int header = DRAW_END;
        mClient.Send((const char *)&header, sizeof(header));
        mClient.Send((const char *)&point, sizeof(point));
    }
}
 
 
void CChildView::OnMouseMove(UINT nFlags, CPoint point)
{
    if (mCurrent == nullptr)
        return;
 
    mCurrent->push_back(point);
    Invalidate(false);
 
    if (mClient.IsValid() == true)
    {
        int header = DRAW_MOVE;
        mClient.Send((const char *)&header, sizeof(header));
        mClient.Send((const char *)&point, sizeof(point));
    }
}
cs


지난 포스팅에서 써놓았듯이 LButtonDown, MouseMove, LButtonUp 메세지에 대한 이벤트 처리이다.

별로 설명할만큼 어려운 코드가 없다. int형 header라는 변수에 앞서 정의해놓은 상수값을 넣고, 4바이트짜리 헤더와, 8바이트짜리 포인트를 Send 함수를 통해 서버에 전달하는 것이 끝.


헤더와 포인터의 주소를 const char * 의 형태로 형변환을 한 것은 전달할 수 있는 버퍼는 char* 형 버퍼만 전달할 수 있기 때문에 저렇게 보내고, 서버에서는 받아서 다시 int나 CPoint등 자신이 원하는 형태로 바꾸어서 사용해야 한다.


이 외에는 어려운 개념이 없으므로 한번 훑어보고 사용하길 바란다

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함