-
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
#defineint 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错误,而且缓冲区的空间变得可用。随机文章:
第9章 套接字选项和IO控制命令 2006-11-28Windows完成端口编程 2006-11-27第五章 网络原理和协议 2006-11-20第三章 邮槽 2006-11-17第二章 重定向器 2006-11-16
收藏到:Del.icio.us








