首页
社区
课程
招聘
[求助]客户端使用WSAAsyncSelect出现的问题
发表于: 2012-6-21 16:10 4487

[求助]客户端使用WSAAsyncSelect出现的问题

2012-6-21 16:10
4487
不知道为什么用了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解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 678
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
connect之后才能异步嘛……
2012-6-21 17:20
0
雪    币: 128
活跃值: (27)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
WSAAsyncSelect
之后
connect == SOCKET_ERROR 并不能当失败处理嘛,
WSAGetLastError 看是不是 Pending…………是的话就正常,不要closesocket了
然后你就等 FD_CONNECT或FD_CLOSE了啊
2012-6-21 21:45
0
雪    币: 62
活跃值: (820)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢你的提示,不判断的话是就不会出现问题了!是我理解不深!真是感谢你了!
2012-6-22 10:00
0
游客
登录 | 注册 方可回帖
返回
//