MFC Socket客户端显示连接上了,服务器端onaccept没有响应

时间:2021-04-27 16:57:05
这个是主对话框函数的的
void CChatServerDlg::OnAccept()
{
// TODO: 在此添加专用代码和/或调用基类
//动态创建用于通信的Socket
m_ServerSocket = new MySocket;
m_ServerSocket->GetDlg(this);
// 接受客户端的连接请求
m_ListenSocket->Accept(*m_ServerSocket); //接受连接请求
m_ServerSocket->AsyncSelect(FD_READ|FD_CLOSE);
m_ListWords.AddString("接受了一个客户端的连接请求");
m_ListWords.SetTopIndex(m_ListWords.GetCount() - 1);

}

void CChatServerDlg::OnClose()
{
// TODO: 在此添加专用代码和/或调用基类
//关闭与客户端的通信信道
m_ListWords.AddString("客户端断开连接");
m_ListWords.SetTopIndex(m_ListWords.GetCount() - 1);
m_ServerSocket->Close(); //关闭与客户端通信的Socket
if(m_ServerSocket != NULL)
{
delete m_ServerSocket;
m_ServerSocket = NULL;
}

}

void CChatServerDlg::OnReceive()
{
// TODO: 在此添加专用代码和/或调用基类
//接收客户端发来的信息
char szTemp[200];
int n = m_ServerSocket->Receive(szTemp,200); //接收信息
szTemp[n] = '\0';
CString sTemp;
sTemp.Format("收到:%s",szTemp);
m_ListWords.AddString(sTemp); //显示信息
m_ListWords.SetTopIndex(m_ListWords.GetCount() - 1);

}

这个是MySocket类的
void MySocket::GetDlg(CChatServerDlg * dlg)   //获得窗口界面的指针
{ m_dlg=dlg;        }



void MySocket::OnAccept(int nErrorCode)
{
// TODO: 在此添加专用代码和/或调用基类
m_dlg->OnAccept();
CAsyncSocket::OnAccept(nErrorCode);
}


void MySocket::OnReceive(int nErrorCode)
{
// TODO: 在此添加专用代码和/或调用基类
((CChatServerDlg*)(AfxGetApp()->m_pMainWnd))->
m_ServerSocket = new MySocket;
((CChatServerDlg*)(AfxGetApp()->m_pMainWnd))->m_ServerSocket->AsyncSelect(FD_READ|FD_CLOSE);
((CChatServerDlg*)(AfxGetApp()->m_pMainWnd))->m_ListWords.AddString("接受了一个客户端的连接请求");
m_dlg->OnReceive();
CAsyncSocket::OnReceive(nErrorCode);
}


void MySocket::OnClose(int nErrorCode)
{
// TODO: 在此添加专用代码和/或调用基类
m_dlg->OnClose();
CAsyncSocket::OnClose(nErrorCode);
}

5 个解决方案

#1


ACCEPT 消息是否注册

#2


引用
ACCEPT 消息是否注册

确实没注册,我试着注册了下,可能方式不对,一直提示注册不成功
if(WSAAsyncSelect(*m_ListenSocket, m_hWnd, WM_NETWORK, FD_CONNECT | FD_READ | FD_CLOSE)==SOCKET_ERROR)
{  
         MessageBox("注册网络事件失败!");  
         closesocket(*m_ListenSocket);  
         WSACleanup();  
     }  

#3


我刚学这个,可能问的挺逗的,还是希望指正下

#4


m_ListenSocket是什么?CAsyncSocket的子类??
如果是的话,直接调用它的接口函数AsyncSelect不行么?

#5


引用 4 楼 shenyi0106 的回复:
m_ListenSocket是什么?CAsyncSocket的子类??
如果是的话,直接调用它的接口函数AsyncSelect不行么?

已经解决了,我换成CSocket类,发现用起来简单多了

#1


ACCEPT 消息是否注册

#2


引用
ACCEPT 消息是否注册

确实没注册,我试着注册了下,可能方式不对,一直提示注册不成功
if(WSAAsyncSelect(*m_ListenSocket, m_hWnd, WM_NETWORK, FD_CONNECT | FD_READ | FD_CLOSE)==SOCKET_ERROR)
{  
         MessageBox("注册网络事件失败!");  
         closesocket(*m_ListenSocket);  
         WSACleanup();  
     }  

#3


我刚学这个,可能问的挺逗的,还是希望指正下

#4


m_ListenSocket是什么?CAsyncSocket的子类??
如果是的话,直接调用它的接口函数AsyncSelect不行么?

#5


引用 4 楼 shenyi0106 的回复:
m_ListenSocket是什么?CAsyncSocket的子类??
如果是的话,直接调用它的接口函数AsyncSelect不行么?

已经解决了,我换成CSocket类,发现用起来简单多了