18,363
社区成员




//“启动服务器”按钮
void CServerDlg::OnBnClickedBeginButton()
{
UpdateData();
StartListen(); //创建服务器套接字,设置成非阻塞模式,绑定端口号,侦听连接。
m_AcceptRecv_Thread =(HANDLE)_beginthreadex( NULL, 0, AcceptRecv , this, 0, &m_AcceptRecv_ThreadId );
if( NULL == m_AcceptRecv_Thread )
return;
UpdateData(FALSE);
}
unsigned __stdcall CServerDlg::AcceptRecv( void * obj )
{
CServerDlg *pDlg = (CServerDlg*)obj;
if( NULL == pDlg)
return -1;
while(true)
pDlg->AcceptRecv();
return 0;
}
void CServerDlg::AcceptRecv()
{
//当数据可读时,表示有新的连接请求
if( !CanRead() )
return;
//同意客户端的连接
SOCKET TempSocket = accept(m_ServerSocket, NULL, NULL);
if(INVALID_SOCKET == TempSocket || NULL == TempSocket)
{
CString strError = GetErrorInfo(); //当客户端向服务器发送消息的时候,返回10022错误!
MessageBox(strError);
KillTimer(WAIT_CONNECT);
return;
}
else
{
m_EC_strStatus += "\r\n客户端连接服务器 成功!\r\n";
m_ServerSocket = TempSocket;
RecvMsg(); //接受数据
}
}
void CServerDlg::RecvMsg()
{
char RecvMsgBuf[1024] = {0};
if(SOCKET_ERROR != recv(m_ServerSocket, RecvMsgBuf, 1024, 0)) //接受客户端传来的数据
m_EC_strRecvMsg = RecvMsgBuf;
}
void CServerDlg::Accept()
{
//当数据可读时,表示有新的连接请求
if( CanRead() )
{
//同意客户端的连接
SOCKET TempSocket = accept(m_ServerSocket, NULL, NULL);
if(INVALID_SOCKET == TempSocket || NULL == TempSocket)
{
CString strError = GetErrorInfo();
MessageBox(strError);
KillTimer(WAIT_CONNECT);
return;
}
else
{
m_EC_strStatus += "\r\n客户端连接服务器 成功!\r\n";
m_ServerSocket = TempSocket;
RecvMsg();
}
}
}
bool CServerDlg::CanRead()
{
fd_set readfds;
timeval timeout;
timeout.tv_sec = 0;
timeout.tv_usec = 0;
FD_ZERO(&readfds);
FD_SET(m_ServerSocket, &readfds);
int ret = select(FD_SETSIZE, &readfds, NULL, NULL, &timeout);
if(ret > 0 && FD_ISSET(m_ServerSocket, &readfds))
return true; //第一次发送的时候是true
else
return false; //但下面在发送的时候,就是false了
}