• 2006-11-27

    8.2.2 WSAAsyncSelect - [多线程程序设计]

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://xingzhesun.blogbus.com/logs/3919346.html

    8.2.2 WSAAsyncSelect
    接收以windows消息为基础的网络事件通知。
    int WSAAsyncSelect(SOCKET s, HWND hWnd, unsigned int wMsg, long lEvent);
    FD_READ, FD_WRITE, FD_ACCEPT, FD_CONNECT和FD_CLOSE.
    从锁定变成非锁定状态。
    #define WM_SOCKET WM_USER+1
    #define

    int WINAPI WinMain(IN HINSTANCE hInstance, IN HINSTANCE hPrevInstance, IN LPSTR lpCmdLine, IN int nShowCmd )
    {
    SOCKET Listen;
    HWND Window;
    sockaddr InternetAddr;

    Window = CreateWindow();

    WSAStartup(...);

    Listen = socket(...);

    InternetAddr.sin_family = AF_INET;
    InternetAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    InternetAddr.sin_port = htons(5150);

    bind(Listen, (PSOCKADDR)&InternetAddr,sizeof(InternetAddr));

    WSAAsyncSelect(Listen, Window, WM_SOCKET, FD_ACCEPT|FD_CLOSE);

    listen(Listen, 5);

    //Translate and dispatch window messages until the application terminates
    }

    BOOL CALLBACK ServerWinProc(HWND hDlg, WORD wMsg,WORD wParam, DWORD lParam)
    {
    SOCKET Accept;
    switch(wMsg)
    {
    case WM_PAINT:
    break;
    case WM_SOCKET:

    //Determine whether an error occurred on the socket by using the WSAGETSLECTERRROR() macro
    if (WSAGETSELECTERROR(lParam))
    {
    closesocket(wParam);
    break;
    }

    //Determine what event occurred on the socket
    switch(WSAGETSELECTEVENT(lParam))
    {
    case FD_ACCEPT:
    Accept = accept(wParam, NULL, NULL);

    //Prepare accepted socket for read, write and close notification.
    WSAAsyncSelect(Accept, hwnd, WM_SOCKET, FD_READ|FD_WRITE|FD_CLOSE);
    break;
    case FD_READ:
    //Receive data from the socket in wparam;
    break;
    case FD_WRITE:
    //The socket in param is ready for sending data;
    break;
    case FD_CLOSE:
    //The connection is now closed
    closesocket(wParam);
    break;
    }
    break;
    }
    return true;
    }
    产生FD_WRITE通知的三种条件
    1.使用connect或者WASConnect,一个套接字首次建立了连接。
    2.使用accept or WSAAccept,套接字被接受以后。
    3.若send WSASend,sendto WSASendto操作失败,返回了WSAEWOULDBLOCK错误,而且缓冲区的空间变得可用。

     


    收藏到:Del.icio.us