#pragma once #define SERVERCLOSEMSG "SERVERCLOSE" #define CLIENTDISCONNECT -10001 #define SERVERDISCONNECT -10002 #define SERVERMESSAGE (WM_USER + 10) #include "akNetworkLinker.h" #include #include #include #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 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(); */