SDC C-Project CF Review 프로그램
LYW
2021-07-29 bd13fa3f9396f1f681759f4623c55d5f91d74a9c
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
 
#pragma once
 
 
 
#define SERVERCLOSEMSG "SERVERCLOSE"
#define CLIENTDISCONNECT -10001
#define SERVERDISCONNECT -10002
#define SERVERMESSAGE (WM_USER + 10)
 
#include "akNetworkLinker.h"
 
 
#include <WinSock2.h>
#include <process.h>
#include <vector>
 
 
#define UDPSERVERCREATE 1000
#define UDPSERVERCLOSE 2000
#define UDPSERVERCONNECTCLIENT 3000
 
 
class AKNETWORK_DLLSPEC CakUDPServer
{
public:
    struct AKNETWORK_DLLSPEC _WorkThreadParam 
    {
        _WorkThreadParam()
        {
            pthis = NULL;
            clntSock;
            clntAddr;
            clntAddrSize = 0;
            hThread = NULL;
            dwThreadID = NULL;
 
            clntAddrSize=sizeof(clntAddr);
        }
 
        void* pthis;
        SOCKET clntSock;
        SOCKADDR_IN clntAddr;
        int clntAddrSize;
        HANDLE hThread;
        unsigned int dwThreadID;
    };
 
public:
    typedef void (*RecvMsgFunc) (char* pMsg, int nMsglen, void*);
    typedef void (*SendMsgFunc) (char* pMsg, int nMsglen, void*);
    typedef void (*SystemMsgFunc) (char* pMsg, int nMsglen, void*);
public:
    CakUDPServer(void);
    ~CakUDPServer(void);
 
    // ¼­¹ö»ý¼º
    BOOL CreateServer(unsigned int port);
    // ¼­¹öÁ¾·á
    void CloseServer();
    // »ý¼ºµÈ ¼­¹ö ¾ÆÀÌÇÇ °ª ¾ò±â
    char* GetServerIP();
    // ¸Þ¼¼Áö ¼Û½Å
    bool Send(char* sendMsg, int length);
    // ¼ÒÄÏ ¸Þ¼¼Áö ¼ö½Å Äݹ頼³Á¤
    void SetRecvMessageCallback(RecvMsgFunc userFunc, void* data = NULL);
    // ¼ÒÄÏ ¸Þ¼¼Áö ¼Û½Å Äݹ頼³Á¤
    void SetSendMessageCallback(SendMsgFunc userFunc, void* data = NULL);
    // ½Ã½ºÅÛ ¸Þ¼¼Áö ¼ö½Å Äݹ頼³Á¤
    void SetSystemMessageCallback(RecvMsgFunc userFunc, void* data = NULL);
    // ¼­¹ö »ý¼º »óÅÂ
    inline bool GetServerState(){return m_isServerCreate;};
    
    bool m_isServerCreate;
 
    unsigned int m_nRecvBufferSize;
 
    bool m_bReCreate;//Ŭ¶óÀÌ¾ðÆ®°¡ Á¢¼Ó Á¾·áÇßÀ»¶§ ÀÚµ¿À¸·Î ´Ù½Ã ¼­¹ö »ý¼º
    bool m_bTick;//°è¼ÓÀûÀ¸·Î Å¬¶óÀÌ¾ðÆ®¿¡°Ô ºñ¾îÀִ ¸Þ¼¼Áö¸¦ º¸³»¼­ ¿¬°á »óÅ ȮÀÎ
 
    enum UDPServerState
    {
        None = 0,
        ussClose,
        ussCreate,
        ussConnectClient
    }m_ServerState;
    SOCKADDR_IN getClinetAddress(){return m_clientAddr;};
    int getServerPort(){return m_nServerPort;};
private:
    HANDLE m_hMutex; //¹ÂÅØ½º º¯¼ö ¼±¾ð
 
    SOCKET m_severSock;
    SOCKADDR_IN m_servAddr;
 
    SOCKADDR_IN m_clientAddr;
    
    HANDLE m_hThread;
    unsigned int m_dwThreadID;
 
    int m_nServerPort;
    
    void EchoMsg(char* message, int len); //³ª¸¦ Æ÷ÇÔÇÑ ¸ðµÎ¿¡°Ô ¸Þ¼¼Áö Àü¼Û
    void EchoMsgNotMe(SOCKET mySocket, char* message, int len); //³ª¸¦ Á¦¿ÜÇÑ ¸ðµÎ¿¡°Ô ¸Þ¼¼Áö Àü¼Û
 
    void RemoveSocketList(SOCKET clntSock, SOCKADDR_IN clntAddr);
 
    static unsigned int __stdcall ThreadMain(void *arg); //¸ÞÀΠ¼­¹ö Å¬¶óÀÌ¾ðÆ® ´ë±â¿ë ¾²·¹µå
    static unsigned int __stdcall ClientWorkFunc(void *arg); //Ŭ¶óÀÌ¾ðÆ® ¸Þ¼¼Áö ¹Þ´Â ¾²·¹µå
    static unsigned int __stdcall TickThread(void *arg); //¸ÞÀΠ¼­¹ö Å¬¶óÀÌ¾ðÆ® ´ë±â¿ë ¾²·¹µå
    
 
    
 
    //void (*pCallBackRecvMsg)(char*,int,void*);                     // Äݹé ÇÔ¼ö
    RecvMsgFunc m_recvmsgFunc;
    void* m_recvmsgData;
    SendMsgFunc m_sendmsgFunc;
    void* m_sendmsgData;
    SystemMsgFunc m_systemmsgFunc;
    void* m_systemmsgData;
 
private:
    std::vector<SOCKET> m_socketList; //Ŭ¶óÀÌ¾ðÆ® ¸®½ºÆ® °ü¸®
 
    
};
 
//////////////////////////////////////////////////////////////////////////
/*
 
1. KimTCPIP.lib, KimTCPIP.dll, KimServer.h ÆÄÀÏ º¹»ç
 
2. ÇÁ·ÎÁ§Æ®¿¡ KimTCPIP.lib Ãß°¡
 
3. ÀνºÅϽº »ý¼º
    - CakUDPServer m_kimserver;
 
4. ¼­¹ö ÃʱâÈ­ ¹× ¼­¹ö »ý¼º
    - InitServer(HWND hwnd);
 
5. ¼­¹ö·ÎºÎÅÍ ¸Þ¼¼Áö(ex)
        LRESULT CControlServerAppDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
        {
            // TODO: ¿©±â¿¡ Æ¯¼öÈ­µÈ Äڵ带 Ãß°¡ ¹×/¶Ç´Â ±âº» Å¬·¡½º¸¦ È£ÃâÇÕ´Ï´Ù.
            
            switch(message)
            {
            case SERVERMESSAGE:
                {
                    switch(wParam)
                    {
                    case 0: //¼­¹ö »ý¼º
                        {
                            m_ctrlMsglist.AddString("¼­¹ö »ý¼º");
                            m_ctrlMsglist.SetTopIndex(m_ctrlMsglist.GetCount()-1);
                            break;
                        }
                    case 1: //Ŭ¶óÀÌ¾ðÆ® Á¢¼Ó
                        {
                            CString msg;
                            msg.Format("%s »ç¿ëÀÚ Á¢¼Ó",(char*)lParam);
                            m_ctrlMsglist.AddString(msg);
                            m_ctrlMsglist.SetTopIndex(m_ctrlMsglist.GetCount()-1);
                            break;
                        }
                    case 2: //Ŭ¶óÀÌ¾ðÆ® Á¾·á
                        {
                            CString msg;
                            msg.Format("%s »ç¿ëÀÚ Á¾·á",(char*)lParam);
                            m_ctrlMsglist.AddString(msg);
                            m_ctrlMsglist.SetTopIndex(m_ctrlMsglist.GetCount()-1);
                            break;
                        }
                        
                    }
                    
 
                    break;
                }
            }
            return CDialog::WindowProc(message, wParam, lParam);
        }
6. ¼­¹ö Á¾·á
    - OnClose(); 
*/