不知道为什么用了WSAAsyncSelect后就不能连接服务器了,注掉就可以连接上了,也不知道为什么。求高人指点!
UINT CClientDlg::ThreadProc( LPVOID pParam )
{
CClientDlg *pThis = (CClientDlg*)pParam;
pThis->InitSocket();
pThis->m_Socket = INVALID_SOCKET;
pThis->m_Socket = socket(AF_INET , SOCK_STREAM , IPPROTO_TCP);
if ( pThis->m_Socket == INVALID_SOCKET )
{
AfxMessageBox(_T("新建Socket失败!"));
closesocket(pThis->m_Socket);
WSACleanup();
return 0;
}
//if( WSAAsyncSelect(pThis->m_Socket, pThis->GetSafeHwnd(), WM_SOCKET, FD_CONNECT|FD_CLOSE|FD_READ|FD_WRITE) == SOCKET_ERROR )
//{
// AfxMessageBox(_T("注册网络事件失败!"));
// closesocket(pThis->m_Socket);
// WSACleanup();
// return 0;
//}
sockaddr_in server;
server.sin_family = AF_INET;
server.sin_port = htons(9527);
server.sin_addr.s_addr = inet_addr("127.0.0.1");
if ( connect(pThis->m_Socket, (sockaddr *)&server, sizeof(sockaddr_in)) == SOCKET_ERROR )
{
AfxMessageBox(_T("连接失败,请重试!"));
closesocket(pThis->m_Socket);
WSACleanup();
return 0;
}
else
AfxMessageBox(_T("连接成功!"));
return TRUE;
}
void CClientDlg::OnBnClickedButton1() //连接服务器
{
AfxBeginThread(ThreadProc, this);
}
对应的WindowProc里要处理的:
LRESULT CClientDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: 在此添加专用代码和/或调用基类
switch(message)
{
case WM_COMMAND:
{
if (wParam == SC_CLOSE)
{
// closesocket(m_Socket);
}
}
break;
case WM_SOCKET:
{
if (WSAGETSELECTERROR(lParam))
{
closesocket(wParam);
break;
}
switch(WSAGETSELECTEVENT(lParam))
{
case FD_CONNECT:
ShowMsg(_T("连接成功!"));
break;
case FD_CLOSE:
closesocket(m_Socket);
break;
case FD_READ:
{
TCHAR szBuf[MAX_BUF_SIZE] = {0};
recv(m_Socket, (char*)szBuf, MAX_BUF_SIZE, 0);
ShowMsg(szBuf);
}
break;
case FD_WRITE:
break;
}
}
break;
default:break;
}
return CDialog::WindowProc(message, wParam, lParam);
}
注释掉WSAAsyncSelect那部分代码就没有问题了,能正常连接,互发消息。但是如果不注释掉的话,就连接不了服务器端。代码哪里写错。。。高手指点!
[课程]Android-CTF解题方法汇总!