#include "LcsServer.h"
#pragma comment(lib,"WS2_32.lib")
CLcsApp theApp;
BOOL CLcsApp::InitInstance()
{
WSADATA wsa;
::WSAStartup(2,&wsa);
AfxOleInit();
m_pConnection.CreateInstance(__uuidof(Connection));
try
{
m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=LCSDATA.mdb","","",adModeUnknown);
}
catch(_com_error e)
{
}
CSerDlg serDlg;
m_pMainWnd=&serDlg;
serDlg.DoModal();
if(m_pConnection->State)
m_pConnection->Close();
m_pConnection= NULL;
return TRUE;
}
BEGIN_MESSAGE_MAP(CSerDlg, CDialog)
ON_COMMAND(IDC_START,OnStart)
ON_MESSAGE(WM_SOCKET,OnSocket)
ON_COMMAND(IDC_COMMAND,Command)
ON_NOTIFY(NM_DBLCLK,IDC_CLIENT,OnDbClick)
END_MESSAGE_MAP();
CSerDlg::CSerDlg(CWnd *pParent):CDialog(IDD_MAIN,pParent)
{
m_pRecordset.CreateInstance(__uuidof(Recordset));
try
{
m_pRecordset->Open("SELECT * FROM userdata",
theApp.m_pConnection.GetInterfacePtr(),
adOpenDynamic,
adLockOptimistic,
adCmdText);
}
catch(_com_error e)
{
m_list.InsertString(m_list.GetCount(),"数据库连接失败,确认数据库LCSDATA.mdb是否在当前路径下!");
}
}
BOOL CSerDlg::OnInitDialog()
{
enroll=0;
ser=new LCSSERVER(m_hWnd);
CDialog::OnInitDialog();
::SetWindowText(m_hWnd,"LCS服务器");
m_list.SubclassDlgItem(IDC_SERVER,this);
m_client.SubclassDlgItem(IDC_CLIENT,this);
m_client.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_SMALLICON);
m_client.InsertColumn(0,"状态",LVCFMT_LEFT,40);
m_client.InsertColumn(1,"ID",LVCFMT_LEFT,50);
m_client.InsertColumn(2,"妮称",LVCFMT_LEFT,90);
m_client.InsertColumn(3,"",0,0);//为用户密码,保密起见不显示
ShowAndCheck();
m_bar.Create(WS_CHILD|WS_VISIBLE|SBS_SIZEGRIP,CRect(0,0,0,0),this,101);
m_bar.SetBkColor(RGB(0xa6,0xca,0xf0));
char IP[30]="本机ip:";
char name[100];
::gethostname(name,100);
HOSTENT* pHost=::gethostbyname(name);
if(pHost!=NULL)
{
in_addr* addr=(in_addr*)*(pHost->h_addr_list);
strcat(IP,inet_ntoa(addr[0]));
}
m_bar.SetText(IP,0,0);
// status[0]=AfxGetApp()->LoadIcon(IDI_ONLINE);
// status[1]=AfxGetApp()->LoadIcon(IDI_LEAVE);
return TRUE;
}
void CSerDlg::ShowAndCheck()
{
enroll=0;
m_client.DeleteAllItems();
int row=0;
CString strName, ID,pass;
if(!m_pRecordset->BOF)
m_pRecordset->MoveFirst();
else
{
m_list.InsertString(m_list.GetCount(),"目前注册的人数目为0..");
}
while(!m_pRecordset->adoEOF)
{
var = m_pRecordset->GetCollect("username");
if(var.vt != VT_NULL)
strName = (LPCSTR)_bstr_t(var);
var = m_pRecordset->GetCollect("ID");
if(var.vt != VT_NULL)
ID= (LPCSTR)_bstr_t(var);
var = m_pRecordset->GetCollect("password");
if(var.vt != VT_NULL)
pass = (LPCSTR)_bstr_t(var);
m_client.InsertItem(row,"离线",0);
m_client.SetItemText(row,1,ID);
m_client.SetItemText(row,2,strName);
m_client.SetItemText(row,3,pass);
row++;
enroll++;
m_pRecordset->MoveNext();
}
}
void CSerDlg::AddData(struct ENROLLMSG *msg)
{
char name[20],password[20],ID[10];
strcpy(name,msg->username);
strcpy(password,msg->password);
strcpy(ID,msg->id);
//其他一些信息
m_pRecordset->AddNew();
m_pRecordset->PutCollect("username", _variant_t(name));
m_pRecordset->PutCollect("ID", _variant_t(ID));
m_pRecordset->PutCollect("password", _variant_t(password));
//其他一些信息
m_pRecordset->Update();
}
void CSerDlg::OnStart()
{
if(ser->m_socket==INVALID_SOCKET)
{
ser->startAll();
GetDlgItem(IDC_START)->SetWindowText("停止服务");
m_list.InsertString(m_list.GetCount(),"服务器启动......");
}
else
{
ser->delAll();
for(int i=0;i<enroll;i++)
m_client.SetItemText(i,0,"离线");
GetDlgItem(IDC_START)->SetWindowText("开启服务");
m_list.InsertString(m_list.GetCount(),"服务器停止......");
}
}
long CSerDlg::OnSocket(WPARAM wParam,LPARAM lParam)
{
SOCKET s=wParam;
if(WSAGETSELECTERROR(lParam))
{
ser->delAll();
::closesocket(ser->m_socket);
return 0;
}
switch(WSAGETSELECTEVENT(lParam))
{
case FD_ACCEPT:
{
if(ser->clientNow<ser->clientSum)
{
SOCKET client=::accept(s,NULL,NULL);
::WSAAsyncSelect(client,m_hWnd,WM_SOCKET,FD_READ|FD_CLOSE);
ser->addSocketOnly(client);
}
else
{
m_list.InsertString(m_list.GetCount(),"连接数已达上限......");
}
}
break;
case FD_CLOSE:
{
struct INFO inf=ser->findInfo(s);
char str[100]={0};
char id[10];
strcpy(id,inf.id);
/*****更新客户列表*****/
int row=ChangeList_Leave(id);
/**********************/
if(row>-1)
{
m_client.GetItemText(row,2,str,20);
strcat(str,"退出了...");
m_list.InsertString(m_list.GetCount(),str);
int count=m_list.GetWindowTextLength();
m_list.SetSel(count,count);
}
ser->delSocket(s);
::closesocket(s);
SendClientList();
}
break;
case FD_READ:
{
char MSG[400];
char *msg=MSG;
int len=::recv(s,msg,400,0);
msg[len]='\0';
ChangeToMsg(msg,s);
}
break;
}
return 0;
}
void CSerDlg::ChangeToMsg(char *msg,SOCKET s)
{
switch(msg[0])
{
//用户消息转发
case '1':
{
struct WORDMSG *Msg=(struct WORDMSG*)(msg+1);
char ID[10];
strcpy(ID,Msg->idto);
SOCKET send=ser->findSocket(ID);
::send(send,msg,250,0);
SendClientList();
}
break;
//用户登陆信息
case '2':
{
struct USERMSG *Msg=(struct USERMSG*)(msg+1);
char loginMsg[3]={0};//返回客户端的信息,相关数值查看文档
/*****更新客户列表*****/
/****客户列表更新过程**/
//从数据库中读取所有用户信息
//将ID和姓名列在列表框中
//将所有头像置灰色
//以上过程可以在初始化时候完成
int row=ChangeList(Msg->id,Msg->password);
//在列表框中查找匹配的ID
//将匹配的ID头像置彩色
//如果没有匹配ID
//在列表框中增加该成员信息
/**********************/
/**根据row的返回数值给客户发信息***/
//连接成功更新服务器信息列表
if(row>-1)
{
char strname[20]={0};
m_client.GetItemText(row,2,strname,20);
struct INFO info;
strncpy(info.id,Msg->id,10);
strncpy(info.username,strname,20);
info.client=s;
info.ip=Msg->ip;
ser->addSocket(info);
//添充数据包,提示用户连接成功
loginMsg[0]='3';
loginMsg[1]='1';
loginMsg[2]='\0';
::send(s,loginMsg,3,0);
strcat(strname,"上线了.....");
m_list.InsertString(m_list.GetCount(),strname);
int count=m_list.GetWindowTextLength();
m_list.SetSel(count,count);
SendClientList();//向客户端发送列表
}
//密码错误
if(row==-2)
{
loginMsg[0]='3';
loginMsg[1]='3';
loginMsg[2]='\0';
::send(s,loginMsg,3,0);
}
//用户名错误
if(row==-3)
{
loginMsg[0]='3';
loginMsg[1]='2';
loginMsg[2]='\0';
::send(s,loginMsg,3,0);
}
//重复登陆
if(row==-4)
{
loginMsg[0]='3';
loginMsg[1]='4';
loginMsg[2]='\0';
::send(s,loginMsg,3,0);
}
}
/************************************/
break;
//用户注册信息
case '3':
{
struct ENROLLMSG *Msg=(struct ENROLLMSG *)(msg+1);
char enrollMsg[3]={0};//返回给客户端的注册信息
int result=CheckEnrollMsg(Msg);
if(result==1)
{
m_client.InsertItem(enroll,"离线",0);
m_client.SetItemText(enroll,1,Msg->id);
m_client.SetItemText(enroll,2,Msg->username);
m_client.SetItemText(enroll,3,Msg->password);
//写入数据库
AddData(Msg);
enroll++;
m_list.InsertString(m_list.GetCount(),"有新用户注册......");
int count=m_list.GetWindowTextLength();
m_list.SetSel(count,count);