关于 WSAAsyncSelect 请教
if SOCKET_ERROR=WSAAsyncSelect(sock, Handle,WM_SOCKET,FD_READ) then
Exit;
正常情况下可以
写成window服务时 Handle 如何设置请教!!!
[解决办法]
服务程序中也可以动态创建一个窗口,用这个窗口来接收和处理socket消息
[解决办法]
你可以生成一个大小为0窗口就好了,使用AllocateHWnd 函数
[解决办法]
請了解一下基于Delphi的Socket I/O模型全接触,WSAEventSelect模型:
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个套接字时,就需要额外创建线程