Добрый день. пишу службу, в неё создается поток, который обрабатывает, события: Код (Text): SocketThread Proc LOCAL Event : dword .while hStopEvent lea eax,[NewEvent] invoke WSAWaitForMultipleEvents, EventTotal, addr EventArray, TRUE,WSA_INFINITE, FALSE mov Event, eax .if eax == INVALID_SOCKET .continue .endif ; invoke WSAResetEvent,EventArray[eax*4] mov ebx, Event mov eax,ebx mov esi, SocketArray[ebx*4] .if eax==WSA_WAIT_FAILED .continue .elseif eax == 0 invoke WSAEnumNetworkEvents,Listen,EventArray[ebx*4],addr NetworkEvents .if eax == INVALID_SOCKET .continue .endif lea edx, NetworkEvents mov eax, (WSANETWORKEVENTS ptr [edx]).lNetworkEvents ;---------------------------------------------------------- .if eax & FD_ACCEPT ; = 8 lea ecx, (WSANETWORKEVENTS ptr [edx]).iErrorCode add ecx, FD_ACCEPT_BIT .if dword ptr [ecx] != 0 ;.break .continue .endif invoke accept, (SOCKET_INFORMATION ptr [esi]).Socket, 0, 0 mov Accept, eax .if eax== INVALID_SOCKET .continue .endif .if EventTotal > WSA_MAXIMUM_WAIT_EVENTS ;=64 invoke closesocket, Accept .continue .endif invoke CreateSocketInformation, Accept mov ecx, EventTotal dec ecx mov edx, EventArray[ecx*4] invoke WSAEventSelect, Accept, edx, FD_READ or FD_CLOSE ;FD_WRITE or .if eax == SOCKET_ERROR .continue .endif .elseif eax & FD_READ ; = 1 .if (NetworkEvents.iErrorCode[FD_READ_BIT] != 0) .continue .endif mov ebx, Event mov esi, SocketArray[ebx*4] .if (dword ptr (SOCKET_INFORMATION ptr [esi]).BytesRECV == 0) lea edi, (SOCKET_INFORMATION ptr [esi]).DataBuf mov (WSABUF ptr [edi]).buf,esi mov (WSABUF ptr [edi]).len,4096 mov Flags, 0 invoke WSARecv, (SOCKET_INFORMATION ptr [esi]).Socket, edi, 1, addr RecvBytes, addr Flags, NULL, NULL .if (eax == -1) invoke WSAGetLastError .if (eax!= WSAEWOULDBLOCK) invoke FreeSocketInformation, Event .continue .endif .else mov eax, RecvBytes mov (SOCKET_INFORMATION ptr [esi]).BytesRECV, eax .endif .endif mov ebx, Event mov esi, SocketArray[ebx*4] lea edi, (SOCKET_INFORMATION ptr [esi]).DataBuf mov (WSABUF ptr [edi]).buf, esi mov (WSABUF ptr [edi]).len, ecx mov (SOCKET_INFORMATION ptr [esi]).BytesRECV, 0 invoke SendData, Event mov eax,Event invoke WSAResetEvent,EventArray[eax*4] .elseif eax & FD_CLOSE ; = 20 .if (NetworkEvents.iErrorCode[FD_CLOSE_BIT] != 0) .continue .endif invoke FreeSocketInformation, Event mov eax,Event invoke WSAResetEvent,EventArray[eax*4] .endif .endif .endw ret SocketThread endp на РНР для тестирования написал, такой код: Код (Text): <?php $package = "test"; $soc = socket_create(AF_INET,SOCK_STREAM,SOL_TCP); if($soc===FALSE) { echo "Don't create socket"; exit(); } $res = socket_connect($soc,"localhost",4005); if($res===FALSE) { echo "Don't connect to socket"; exit(); } socket_write($soc, $package, strlen($package)); ?> в отладчике смотрю, на: Код (Text): invoke WSAEnumNetworkEvents,Listen,EventArray[ebx*4],addr NetworkEvents lea edx, NetworkEvents mov eax, (WSANETWORKEVENTS ptr [edx]).lNetworkEvents первый раз ЕАХ = FD_ACCEPT второй раз ЕАХ = 0 хотя после: socket_write($soc, $package, strlen($package)); должно быть событие FD_READ ни чего не понимаю от куда 0 ?! даже если убрать в РНР скрипте: socket_write($soc, $package, strlen($package)); всё равно есть 0, но нет события на чтение. Может мне кто нибудь обяснить в чем проблема? Спасибо
не eax == INVALID_SOCKET , а eax == WSA_WAIT_FAILED хотя это в принципе неважно.. ps: WSAEnumNetworkEvents всегда вызывается для Listen, а событие FD_READ происходит для Accept
>invoke WSAEnumNetworkEvents,Listen,EventArray[ebx*4],addr NetworkEvents нужно очищать структуру NetworkEvents
Доброго времени суток. В принципе я нашел в чем причина, этот кусок кода я нашел тут на форуме, ошибка была в invoke WSAEnumNetworkEvents,Listen,EventArray[ebx*4],addr NetworkEvents надо было написать: invoke WSAEnumNetworkEvents,(SOCKET_INFORMATION ptr [esi]).Socket,EventArray[ebx*4],addr NetworkEvents 0-к он все равно приходил, но после него были и FD_READ, FD_CLOSE