使用WSAAsyncSelect从套接字读取数据

时间:2014-03-06 20:40:31

标签: sockets winapi

是否可以在窗口进程的WSAAsyncSelect消息中调用WM_CREATEWinProc),然后在同一recv内执行所有WinProc个操作({例如recv并用WM_SOCKET下的接收字节数据填充控件?

例如,我知道在WinProc内执行长任务会导致窗口无响应(因为在完成此消息之前它无法处理其他消息),但是我没有看到任何处理此消息的示例具有线程或事件对象的recv I / O.完全没必要吗?

以下是我在网上看到的WinProc中的示例案例,以及在Petzold中recv以类似的方式处理:

    case WM_SOCKET:
    {
        if(WSAGETSELECTERROR(lParam))
        {   
            MessageBox(hWnd,
                "Connection to server failed",
                "Error",
                MB_OK|MB_ICONERROR);
            SendMessage(hWnd,WM_DESTROY,NULL,NULL);
            break;
        }
        switch(WSAGETSELECTEVENT(lParam))
        {
            case FD_READ:
            {
                char szIncoming[1024];
                ZeroMemory(szIncoming,sizeof(szIncoming));

                int inDataLength=recv(Socket,
                    (char*)szIncoming,
                    sizeof(szIncoming)/sizeof(szIncoming[0]),
                    0);

                strncat(szHistory,szIncoming,inDataLength);
                strcat(szHistory,"\r\n");

                SendMessage(hEditIn,
                    WM_SETTEXT,
                    sizeof(szIncoming)-1,
                    reinterpret_cast<LPARAM>(&szHistory));
            }
            break;

            case FD_CLOSE:
            {
                MessageBox(hWnd,
                    "Server closed connection",
                    "Connection closed!",
                    MB_ICONINFORMATION|MB_OK);
                closesocket(Socket);
                SendMessage(hWnd,WM_DESTROY,NULL,NULL);
            }
            break;
        }
    } 

1 个答案:

答案 0 :(得分:0)

是的,这是完全可以接受的。虽然通常会等到CreateWindow/Ex()退出,然后再调用WSAAsyncSelect()。但无论哪种方式都可行。只需确保处理recv()失败的情况,或返回的字节数少于您要求的字节数。