📄 connectthread.cpp
字号:
// ConnectThread.cpp : implementation file
//
#include "stdafx.h"
#include "FiveChessServer.h"
#include "ConnectThread.h"
#include "FiveChessServerDlg.h"
#include "define.h"
#include <afxwin.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CConnectThread
IMPLEMENT_DYNCREATE(CConnectThread, CWinThread)
CConnectThread::CConnectThread()
{
m_bDone=FALSE;//初始化允许线程运行
m_pOwner=NULL;//将该指针置为空
m_bAutoDelete=TRUE;//要求自动删除线程对象
}
CConnectThread::~CConnectThread()
{
}
BOOL CConnectThread::InitInstance()
{
// TODO: perform and per-thread initialization here
return TRUE;
}
int CConnectThread::ExitInstance()
{
// TODO: perform any per-thread cleanup here
return CWinThread::ExitInstance();
}
int CConnectThread::Run()
{
if (m_pOwner==NULL)
{
return FALSE;
}
HWND hWnd=m_pOwner->GetSafeHwnd();
while (!m_bDone)
{
int ret=0;
int count=0;
int pos[5][2];
//初始化拆分字符串的类
Split.SetSplitFlag(" ");
Split.SetSequenceAsOne(TRUE);
//清空棋盘
m_pMatch.Clear();
//设置非阻塞模式
ULONG NonBlock=1;
if(ioctlsocket(m_pSocket,FIONBIO,(u_long *)&NonBlock)==SOCKET_ERROR)
{
//设置失败
m_pOwner->m_string+="非阻塞失败";
m_pOwner->m_string+=(char)0x0d; //换行
m_pOwner->m_string+=(char)0x0a; //回车
m_pOwner->GetDlgItem(IDC_STRING)->SetWindowText(m_pOwner->m_string);
return FALSE;
}
// select模型处理过程
/*
readfds集合包含以下任何一个条件的套接字:
(1)有数据可以读入
(2)连接已经被关闭、重启或终止
(3)假如已调用了LISTEN,而且有一个连接正处于搁置状态
*/
// 初始化一个套节字集合fdSocket,添加监听套节字句柄到这个集合
FD_ZERO(&fdSocket);
FD_SET(m_pSocket,&fdSocket);
while(TRUE)
{
//将fdSocket集合的一个拷贝fdRead传递给select函数,
//当有事件发生时,select函数移除fdRead集合中没有未决I/O操作的套节字句柄,然后返回。
fd_set fdRead=fdSocket;
ret=select(0,&fdRead,NULL,NULL,NULL);
if(ret>0)
{
//通过将原来fdSocket集合与select处理过的fdRead集合比较,
//确定都有哪些套节字有未决I/O,并进一步处理这些I/O。
//理论上来说队列可以包含连接64个,但此,例子中应该仅仅用到2个即可,所以可以考虑改小
for(int i=0;i<(int)fdSocket.fd_count;i++)
{
if(FD_ISSET(fdSocket.fd_array[i],&fdRead))
{
if(fdSocket.fd_array[i]==m_pSocket)//监听套节字接收到新连接
{
if(fdSocket.fd_count<FD_SETSIZE)
{
int addrlen=sizeof(m_pAddr);
SOCKET socket=accept(m_pSocket,(SOCKADDR*)&addrlen,&addrlen);
FD_SET(socket,&fdSocket);
ssend="initial 15 15\n";
if(send(socket,ssend.GetBuffer(0),ssend.GetLength(),0)==SOCKET_ERROR)
{
//AfxMessageBox("Client Send data error");
return FALSE;
}
}
else
{
//AfxMessageBox("Too much connections!\n");
continue;
}
}
else
{
ret=recv(fdSocket.fd_array[i],srev,sizeof(srev),0);
if(ret>0) //可读
{
srev[ret]='\0';
CString str=srev;
Split.SetData(str);
CStringArray array;
Split.GetSplitStrArray(array);
for(int x=0;x<array.GetSize();x++)
{
if(array[x].Find("ready")==0)
{
count++;
if(count>=2)
{
ssend="run000\n";
send(fdSocket.fd_array[1],ssend.GetBuffer(0),ssend.GetLength(),0);
ssend="wait\n";
send(fdSocket.fd_array[2],ssend.GetBuffer(0),ssend.GetLength(),0);
}
}
if(array[x].Find("step")==0)
{
//解析出来客户端传来要走的步骤
//在写客户端程序的时候行列相反,画图时候考虑
CString qpm=array[x+1];
rowno=atoi(qpm);//CString型转化为int型
CString qpn=array[x+2];
lineno=atoi(qpn);
if(i==1)
m_pOwner->m_string+="黑:step "+qpm+" "+qpn;
else if(i==2)
m_pOwner->m_string+="白:step "+qpm+" "+qpn;
//AfxMessageBox(m_pOwner->m_string);
m_pOwner->m_string+=(char)0x0d; //换行
m_pOwner->m_string+=(char)0x0a; //回车
m_pOwner->GetDlgItem(IDC_STRING)->SetWindowText(m_pOwner->m_string);
if(i==1)
{
if(m_pMatch.CanDown(rowno,lineno,BLACK)==FALSE)
{
AfxMessageBox("你在盖高楼吧!");
return FALSE;
}
m_pOwner->m_pBoard[lineno-1][rowno-1]=BLACK;
m_pOwner->count=1;
::SendMessage(hWnd,WM_PAINT,0,0);
if(m_pMatch.IsWin(BLACK,pos)==TRUE)
{
AfxMessageBox("黑方赢!");
ssend="end win\n";
send(fdSocket.fd_array[1],ssend.GetBuffer(0),ssend.GetLength(),0);
ssend="end lose\n";
send(fdSocket.fd_array[2],ssend.GetBuffer(0),ssend.GetLength(),0);
return TRUE;
}
ssend="wait\n";
send(fdSocket.fd_array[1],ssend.GetBuffer(0),ssend.GetLength(),0);
ssend="step "+qpm+" "+qpn+"\n";
send(fdSocket.fd_array[2],ssend.GetBuffer(0),ssend.GetLength(),0);
ssend="run111\n";
send(fdSocket.fd_array[2],ssend.GetBuffer(0),ssend.GetLength(),0);
}
if(i==2)
{
if(m_pMatch.CanDown(rowno,lineno,WHITE)==FALSE)
{
AfxMessageBox("你在盖高楼吧!");
return FALSE;
}
m_pOwner->m_pBoard[lineno-1][rowno-1]=WHITE;
m_pOwner->count=1;
::SendMessage(hWnd,WM_PAINT,0,0);
if(m_pMatch.IsWin(WHITE,pos)==TRUE)
{
AfxMessageBox("白方赢!");
ssend="end lose\n";
send(fdSocket.fd_array[1],ssend.GetBuffer(0),ssend.GetLength(),0);
ssend="end win\n";
send(fdSocket.fd_array[2],ssend.GetBuffer(0),ssend.GetLength(),0);
return TRUE;
}
ssend="wait\n";
send(fdSocket.fd_array[2],ssend.GetBuffer(0),ssend.GetLength(),0);
ssend="step "+qpm+" "+qpn+"\n";
send(fdSocket.fd_array[1],ssend.GetBuffer(0),ssend.GetLength(),0);
ssend="run111\n";
send(fdSocket.fd_array[1],ssend.GetBuffer(0),ssend.GetLength(),0);
}
}
}
}
}
}
}
}
}
m_bDone=TRUE; //控制循环次数
}
return 1;
}
BEGIN_MESSAGE_MAP(CConnectThread, CWinThread)
//{{AFX_MSG_MAP(CConnectThread)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CConnectThread message handlers
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -