⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 connectthread.cpp

📁 本程序作为五子棋对局程序的裁判程序
💻 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 + -