读书人

关于 WSAAsyncSelect 请问

发布时间: 2012-03-23 12:06:21 作者: rapoo

关于 WSAAsyncSelect 请教
if SOCKET_ERROR=WSAAsyncSelect(sock, Handle,WM_SOCKET,FD_READ) then
Exit;
正常情况下可以
写成window服务时 Handle 如何设置请教!!!

[解决办法]
服务程序中也可以动态创建一个窗口,用这个窗口来接收和处理socket消息
[解决办法]
你可以生成一个大小为0窗口就好了,使用AllocateHWnd 函数
[解决办法]
了解一下基于Delphi的Socket I/O模型全接触,WSAEventSelect模型:

Delphi(Pascal) code
procedure TListenThread.Execute; var   hEvent : WSAEvent;   ret : Integer;   ne : TWSANetworkEvents;   sock : TSocket;   adr : TSockAddrIn;   sMsg : String;   Index,   EventTotal : DWORD;   EventArray : Array [0..WSA_MAXIMUM_WAIT_EVENTS-1] of WSAEVENT; begin   ...socket...bind...   hEvent := WSACreateEvent();   WSAEventSelect( ListenSock, hEvent, FD_ACCEPT or FD_CLOSE );   ...listen...   while ( not Terminated ) do   begin    Index := WSAWaitForMultipleEvents( EventTotal, @EventArray[0], FALSE, WSA_INFINITE, FALSE );    FillChar( ne, sizeof(ne), 0 );    WSAEnumNetworkEvents( SockArray[Index-WSA_WAIT_EVENT_0], EventArray[Index-WSA_WAIT_EVENT_0], @ne );    if ( ne.lNetworkEvents and FD_ACCEPT ) > 0 then    begin     if ne.iErrorCode[FD_ACCEPT_BIT] <> 0 then      continue;     ret := sizeof(adr);     sock := accept( SockArray[Index-WSA_WAIT_EVENT_0], adr, ret );     if EventTotal > WSA_MAXIMUM_WAIT_EVENTS-1 then//这里WSA_MAXIMUM_WAIT_EVENTS同样是64     begin      closesocket( sock );      continue;     end;     hEvent := WSACreateEvent();     WSAEventSelect( sock, hEvent, FD_READ or FD_WRITE or FD_CLOSE );     SockArray[EventTotal] := sock;     EventArray[EventTotal] := hEvent;     Inc( EventTotal );    end;    if ( ne.lNetworkEvents and FD_READ ) > 0 then    begin     if ne.iErrorCode[FD_READ_BIT] <> 0 then      continue;      FillChar( RecvBuf[0], PACK_SIZE_RECEIVE, 0 );      ret := recv( SockArray[Index-WSA_WAIT_EVENT_0], RecvBuf[0], PACK_SIZE_RECEIVE, 0 );      ......     end;    end; end;
[解决办法]
WSAEventSelect模型的不足之处是:每个WSAEventSelect模型最多只能管理64个套接字。
当应用程序中需要管理多余64个套接字时,就需要额外创建线程

读书人网 >.NET

热点推荐