#include-once ; If Not IsDeclared('hWS2_32') Then Global $hWS2_32 = DllOpen('Ws2_32.dll') If @error Then MsgBox(8208, '_WSA_TCPAccept', 'Error: Ws2_32.dll') EndIf EndIf ; ; ; #FUNCTION# ===================================================================== ; Name.........: _WSA_TCPAccept() ;..............: ; Version......: AutoIt v3.3.8.1+ ;..............: ; Dependencies.: a handle to ws2_32.dll ;..............: ; @error.......; 0 no error ;..............: 1 dll error ;..............: 2 socket error ;..............: else, WSA Error Code ;..............: ; Return Value.: on error or no socket available, returns -1 ;..............: else, returns socket ;..............: ; Remarks......: Link to WSA Error Codes: ; http://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v=vs.85).aspx ;================================================================================= Func _WSA_TCPAccept($nSocket) Local $aResult = DllCall($hWS2_32, 'int', 'ioctlsocket', 'int', $nSocket, 'dword', 0x8004667E, 'uint*', 1); FIONBIO, NON-BLOCKING MODE If @error Then Return SetError(1, 0, -1); dll error ElseIf $aResult[0] <> 0 Then Return SetError(2, 0, -1); socket error - could not set non-blocking mode EndIf ; Local $tSockAddr = DllStructCreate('short sin_family;ushort sin_port;ulong s_addr;char sin_zero[8];') ; $aResult = DllCall($hWS2_32, 'uint', 'accept', 'uint', $nSocket, 'struct*', $tSockAddr, 'int*', DllStructGetSize($tSockAddr)) If @error Then Return SetError(1, 0, -1); dll error EndIf $nSocket = $aResult[0] ; Local $aError = DllCall($hWS2_32, 'int', 'WSAGetLastError') If @error Then Return SetError(1, 0, -1); dll error ElseIf ($nSocket < 1) Or ($aError[0] = 10035) Then; WSAEWOULDBLOCK Return SetError(0, 0, -1); no socket available ElseIf $aError[0] > 5 Then Return SetError($aError[0], 0, -1); WSA Error Code Else Return SetError(0, 0, $nSocket); success EndIf EndFunc ;