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
确实没注册,我试着注册了下,可能方式不对,一直提示注册不成功
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不行么?
如果是的话,直接调用它的接口函数AsyncSelect不行么?
#5
已经解决了,我换成CSocket类,发现用起来简单多了
#1
ACCEPT 消息是否注册
#2
确实没注册,我试着注册了下,可能方式不对,一直提示注册不成功
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不行么?
如果是的话,直接调用它的接口函数AsyncSelect不行么?
#5
已经解决了,我换成CSocket类,发现用起来简单多了