异步选择函数WSAAsyncSelect()允许应用程序提名一个或多个感兴趣的网络事件.FD_READ,FD_WRITE,FD_CONNCET,FD_ACCEPT等代表网络事件,当被提名的网络事件发生时,windows应用程序的窗口函数将收到一个消息。这段话到底说什么意思啊,比如如下代码:
//function start
{
……
if((s=socket(AF_INET,SOCK_STREAM,0))==INVALID_SOCKET)
{
return FALSE;
}
if(!SetSelect(hWnd,FD_CONNECT))
{
return FALSE;
}
connect(s,(struct sockaddr FAR *)&dst_addr,sizeof(dst_addr));
……
}BOOL SetSelect(HWND hWnd,long IEvent)
{
if(WSAAsyncSelect(s,hWnd,UM_SOCK,IEvent)==SOCKET_ERROR)
{
return FALSE;
}
return TRUE;
}
//message process function
long ClientProc(HWND hWnd,unsigned message,UNIT wParam,UNIT lParam)
{
switch(message)
{
case WM_USER:
{
……
}
case WM_COMMAND:
switch(wParam)
{
…… }
case UM_SOCK:
switch(lParam)
{
case FD_CONNECT:
if(!SetSelect(hWnd,FD_WRITE)
closesocket(s);
break;
case FD_READ:
{
……
if(!SetSelect(hWnd,FD_WRITE))
closesocket(s);
break;
}
case FD_WRITE:
{
……
if(!SetSelect(hWnd,FD_READ))
closesocket(s);
break;
}
}
}
}各位大侠能不能对上面这段代码的运行过程给小弟说下啊,在start function中
首先创建socket,然后调用SetSelect(hWnd,FD_CONNECT),它是马上想应用程序发送FD_CONNECT消息并且应用程序马上处理该消息,还是等做了下面的connect函数之后才发送的,还有在vmessage process function中那个case FD_WRITE:这段代码是什么时候做的,
总之各位大侠给我讲的越仔细越好了呵呵
//function start
{
……
if((s=socket(AF_INET,SOCK_STREAM,0))==INVALID_SOCKET)
{
return FALSE;
}
if(!SetSelect(hWnd,FD_CONNECT))
{
return FALSE;
}
connect(s,(struct sockaddr FAR *)&dst_addr,sizeof(dst_addr));
……
}BOOL SetSelect(HWND hWnd,long IEvent)
{
if(WSAAsyncSelect(s,hWnd,UM_SOCK,IEvent)==SOCKET_ERROR)
{
return FALSE;
}
return TRUE;
}
//message process function
long ClientProc(HWND hWnd,unsigned message,UNIT wParam,UNIT lParam)
{
switch(message)
{
case WM_USER:
{
……
}
case WM_COMMAND:
switch(wParam)
{
…… }
case UM_SOCK:
switch(lParam)
{
case FD_CONNECT:
if(!SetSelect(hWnd,FD_WRITE)
closesocket(s);
break;
case FD_READ:
{
……
if(!SetSelect(hWnd,FD_WRITE))
closesocket(s);
break;
}
case FD_WRITE:
{
……
if(!SetSelect(hWnd,FD_READ))
closesocket(s);
break;
}
}
}
}各位大侠能不能对上面这段代码的运行过程给小弟说下啊,在start function中
首先创建socket,然后调用SetSelect(hWnd,FD_CONNECT),它是马上想应用程序发送FD_CONNECT消息并且应用程序马上处理该消息,还是等做了下面的connect函数之后才发送的,还有在vmessage process function中那个case FD_WRITE:这段代码是什么时候做的,
总之各位大侠给我讲的越仔细越好了呵呵
if(!SetSelect(hWnd,FD_WRITE)
closesocket(s);
break;
这又是什么意思啊,难道等待write事件发生码,而send才会发送FD_WRITE是吗,如果不send那么消息不是就不能循环下去了??
1、创建socket, 只有FD_CONNECT事件需要发送到消息处理函数
2、响应FD_CONNECT事件,只有FD_WRITE需要处理,其它忽略
3、响应FD_WRITE事件,此后只有FD_READ需要处理,其它忽略
4、响应FD_READ事件,此后只有FD_WRITE需要处理,其它消息忽略另:
FD_CONNECT事件后,就自动会有一个FD_WRITE事件,不需要send函数
{
……
if(!SetSelect(hWnd,FD_READ))
closesocket(s);
break;
这段代码是吗?
然后设置成只有FD_READ事件需要发送到消息处理函数而其它忽略,那么这个时候会怎么样
呢,难道是一直等待FD_READ事件发生吗?而让FD_READ事件发生是否只有收到了套接字另一端的数据既这边的套接字有数据可读的时候才发生,否则将一直不作什么,对吗?
还有一个问题:如果客户端套接字被关闭比如是计算机重启,那么在服务器端会收到什么消息吗?