#include "stdafx.h"
#include "MyDataInstance.h"
CMyDataInstance::CMyDataInstance(void)
{
}
CMyDataInstance::~CMyDataInstance(void)
{
}
CMyDataInstance *CMyDataInstance::myInstance=NULL;
CMyDataInstance *CMyDataInstance::getInstance()
{
if (myInstance==NULL)
{
myInstance=new CMyDataInstance();
}
return myInstance;
}
void CMyDataInstance::sendMsg(CString parkID,char *text)
{
ilt=myMap.find(parkID);
if (ilt->second.conn_flag)
{
send(ilt->second.sock,text,strlen(text),0);
}
}
#pragma once
#include <map>
using namespace std;
struct sockData
{
CString ip_address;
SOCKET sock;
boolean conn_flag;
};
class CMyDataInstance
{
public:
CMyDataInstance(void);
~CMyDataInstance(void);
static CMyDataInstance *getInstance();
int testNum;
void sendMsg(CString parkID,char *text);
public:
map<CString,sockData> myMap;
map<CString,sockData>::iterator ilt;
private:
static CMyDataInstance *myInstance;
};
#pragma once
class CMyServer
{
public:
CMyServer(void);
~CMyServer(void);
int openServer();
};
#include "stdafx.h"
#include "MyServer.h"
#include "MyServerThread.h"
CMyServer::CMyServer(void)
{
}
CMyServer::~CMyServer(void)
{
}
int CMyServer::openServer()
{
CWinThread *serverThread=AfxBeginThread(RUNTIME_CLASS(CMyServerThread));
return 0;
}
#pragma once
#include "MyDataInstance.h"
class CMyServerThread : public CWinThread
{
DECLARE_DYNCREATE(CMyServerThread)
protected:
CMyServerThread();
virtual ~CMyServerThread();
public:
virtual BOOL InitInstance();
virtual int ExitInstance();
SOCKET s,s1;
CWinThread *comThread;
sockData myData;
public:
static UINT MulThreadFunc(LPVOID lpParam);
protected:
DECLARE_MESSAGE_MAP()
};
#include "stdafx.h"
#include "MFC.h"
#include "MyServerThread.h"
#pragma comment(lib,"WS2_32.lib")//显式连接套接字库
IMPLEMENT_DYNCREATE(CMyServerThread, CWinThread)
CMyServerThread::CMyServerThread()
{
}
CMyServerThread::~CMyServerThread()
{
}
UINT CMyServerThread::MulThreadFunc(LPVOID lpParam)
{
sockData *data1=(sockData *)lpParam;
CString parkID;
CMyDataInstance *dataInstance=CMyDataInstance::getInstance();
while (1)
{
char recvBuf[100]={0};
int result=recv(data1->sock,recvBuf,100,0);
TRACE("%s\n",recvBuf);
CString result_str(recvBuf);
result_str=result_str.Trim();
if (result_str.Left(6)=="parkID")
{
parkID=result_str.Mid(7);
dataInstance->myMap.insert(pair<CString,sockData>(parkID,*data1));
}
if (result<=0)
{
dataInstance->ilt=dataInstance->myMap.find(parkID);
if (dataInstance->ilt->first)
{
data1->conn_flag=FALSE;
dataInstance->myMap.insert(pair<CString,sockData>(parkID,*data1));
}
closesocket(data1->sock);
break;
}
}
return 0;
}
BOOL CMyServerThread::InitInstance()
{
WSADATA data;
WORD w=MAKEWORD(2,0);
::WSAStartup(w,&data);
s=::socket(AF_INET,SOCK_STREAM,0);
sockaddr_in addr,addr2;
int n=sizeof(addr2);
addr.sin_family=AF_INET;
addr.sin_port=htons(1030);
addr.sin_addr.S_un.S_addr=INADDR_ANY;
::bind(s,(sockaddr *)&addr,sizeof(addr));
::listen(s,5);
TRACE("服务器已经启动\r\n");
while (true)
{
s1=::accept(s,(sockaddr *)&addr2,&n);
myData.ip_address=inet_ntoa(addr2.sin_addr);
myData.sock=s1;
myData.conn_flag=true;
TRACE("客户端连接:%s\n",inet_ntoa(addr2.sin_addr));
TRACE("客户端连接:%s\n",myData.ip_address);
comThread=AfxBeginThread(MulThreadFunc,&myData);
comThread->ResumeThread();
}
return TRUE;
}
int CMyServerThread::ExitInstance()
{
closesocket(s);
return CWinThread::ExitInstance();
}
BEGIN_MESSAGE_MAP(CMyServerThread, CWinThread)
END_MESSAGE_MAP()