Advertisement
Guest User

Untitled

a guest
Feb 14th, 2017
222
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
AutoIt 9.02 KB | None | 0 0
  1. ;http://code.msdn.microsoft.com/windowsdesktop/WinHTTP-WebSocket-sample-50a140b5/sourcecode?fileId=51199&pathId=1032775223
  2.  
  3. #include "WinHttp.au3"
  4. #include <WinAPI.au3> ;_WinAPI_GetLastError
  5.  
  6. Global Const $ERROR_NOT_ENOUGH_MEMORY = 8
  7. Global Const $ERROR_INVALID_PARAMETER = 87
  8.  
  9. Global Const $WINHTTP_OPTION_UPGRADE_TO_WEB_SOCKET = 114
  10.  
  11. Global Const $WINHTTP_WEB_SOCKET_BINARY_MESSAGE_BUFFER_TYPE = 0
  12. Global Const $WINHTTP_WEB_SOCKET_BINARY_FRAGMENT_BUFFER_TYPE = 1
  13.  
  14. Global Const $WINHTTP_WEB_SOCKET_SUCCESS_CLOSE_STATUS = 1000
  15.  
  16. Global $hOpen = 0, $hConnect = 0, $hRequest = 0, $hWebSocket = 0
  17. Global $iError = 0
  18.  
  19. Example()
  20. Exit quit()
  21.  
  22. Func Example()
  23.     Local $sServerName = "198.204.243.50:6004"
  24.     Local $sPath = ""
  25.  
  26.     Local $sMessage = "Hello world"
  27.  
  28.     ; Create session, connection and request handles.
  29.  
  30.     $hOpen = _WinHttpOpen("WebSocket sample", $WINHTTP_ACCESS_TYPE_DEFAULT_PROXY)
  31.     If $hOpen = 0 Then
  32.         $iError = _WinAPI_GetLastError()
  33.         ConsoleWrite("Open error" & @CRLF)
  34.         Return False
  35.     EndIf
  36.  
  37.     $hConnect = _WinHttpConnect($hOpen, $sServerName, $INTERNET_DEFAULT_HTTP_PORT)
  38.     If $hConnect = 0 Then
  39.         $iError = _WinAPI_GetLastError()
  40.         ConsoleWrite("Connect error" & @CRLF)
  41.         Return False
  42.     EndIf
  43.  
  44.     $hRequest = _WinHttpOpenRequest($hConnect, "GET", $sPath, "")
  45.     If $hRequest = 0 Then
  46.         $iError = _WinAPI_GetLastError()
  47.         ConsoleWrite("OpenRequest error" & @CRLF)
  48.         Return False
  49.     EndIf
  50.  
  51.     ; Request protocol upgrade from http to websocket.
  52.  
  53.     Local $fStatus = _WinHttpSetOptionNoParams($hRequest, $WINHTTP_OPTION_UPGRADE_TO_WEB_SOCKET)
  54.     If Not $fStatus Then
  55.         $iError = _WinAPI_GetLastError()
  56.         ConsoleWrite("SetOption error" & @CRLF)
  57.         Return False
  58.     EndIf
  59.  
  60.     ; Perform websocket handshake by sending a request and receiving server's response.
  61.     ; Application may specify additional headers if needed.
  62.  
  63.     $fStatus = _WinHttpSendRequest($hRequest)
  64.     If Not $fStatus Then
  65.         $iError = _WinAPI_GetLastError()
  66.         ConsoleWrite("SendRequest error" & @CRLF)
  67.         Return False
  68.     EndIf
  69.  
  70.     $fStatus = _WinHttpReceiveResponse($hRequest)
  71.     If Not $fStatus Then
  72.         $iError = _WinAPI_GetLastError()
  73.         ConsoleWrite("SendRequest error" & @CRLF)
  74.         Return False
  75.     EndIf
  76.  
  77.     ; Application should check what is the HTTP status code returned by the server and behave accordingly.
  78.     ; WinHttpWebSocketCompleteUpgrade will fail if the HTTP status code is different than 101.
  79.  
  80.     $hWebSocket = _WinHttpWebSocketCompleteUpgrade($hRequest, 0)
  81.     If $hWebSocket = 0 Then
  82.         $iError = _WinAPI_GetLastError()
  83.         ConsoleWrite("WebSocketCompleteUpgrade error" & @CRLF)
  84.         Return False
  85.     EndIf
  86.  
  87.     _WinHttpCloseHandle($hRequest)
  88.     $hRequestHandle = 0
  89.  
  90.     ConsoleWrite("Succesfully upgraded to websocket protocol" & @CRLF)
  91.  
  92.     ; Send and receive data on the websocket protocol.
  93.  
  94.     $iError = _WinHttpWebSocketSend($hWebSocket, _
  95.             $WINHTTP_WEB_SOCKET_BINARY_MESSAGE_BUFFER_TYPE, _
  96.             $sMessage)
  97.     If @error Or $iError <> 0 Then
  98.         ConsoleWrite("WebSocketSend error" & @CRLF)
  99.         Return False
  100.     EndIf
  101.  
  102.     ConsoleWrite("Sent message to the server: " & $sMessage & @CRLF)
  103.  
  104.     Local $iBufferLen = 1024
  105.     Local $tBuffer = 0, $bRecv = Binary("")
  106.  
  107.     Local $iBytesRead = 0, $iBufferType = 0
  108.     Do
  109.         If $iBufferLen = 0 Then
  110.             $iError = $ERROR_NOT_ENOUGH_MEMORY
  111.             Return False
  112.         EndIf
  113.  
  114.         $tBuffer = DllStructCreate("byte[" & $iBufferLen & "]")
  115.  
  116.         $iError = _WinHttpWebSocketReceive($hWebSocket, _
  117.                 $tBuffer, _
  118.                 $iBytesRead, _
  119.                 $iBufferType)
  120.         If @error Or $iError <> 0 Then
  121.             ConsoleWrite("WebSocketReceive error" & @CRLF)
  122.             Return False
  123.         EndIf
  124.  
  125.         ; If we receive just part of the message restart the receive operation.
  126.  
  127.         $bRecv &= BinaryMid(DllStructGetData($tBuffer, 1), 1, $iBytesRead)
  128.         $tBuffer = 0
  129.  
  130.         $iBufferLen -= $iBytesRead
  131.     Until $iBufferType <> $WINHTTP_WEB_SOCKET_BINARY_FRAGMENT_BUFFER_TYPE
  132.  
  133.     ; We expected server just to echo single binary message.
  134.  
  135.     If $iBufferType <> $WINHTTP_WEB_SOCKET_BINARY_MESSAGE_BUFFER_TYPE Then
  136.         ConsoleWrite("Unexpected buffer type" & @CRLF)
  137.         $iError = $ERROR_INVALID_PARAMETER
  138.         Return False
  139.     EndIf
  140.  
  141.     ConsoleWrite("Received message from the server: '" & BinaryToString($bRecv) & "'" & @CRLF)
  142.  
  143.     ; Gracefully close the connection.
  144.  
  145.     $iError = _WinHttpWebSocketClose($hWebSocket, _
  146.             $WINHTTP_WEB_SOCKET_SUCCESS_CLOSE_STATUS)
  147.     If @error Or $iError <> 0 Then
  148.         ConsoleWrite("WebSocketClose error" & @CRLF)
  149.         Return False
  150.     EndIf
  151.  
  152.     ; Check close status returned by the server.
  153.  
  154.     Local $iStatus = 0, $iReasonLengthConsumed = 0
  155.     Local $tCloseReasonBuffer = DllStructCreate("byte[123]")
  156.  
  157.     $iError = _WinHttpWebSocketQueryCloseStatus($hWebSocket, _
  158.             $iStatus, _
  159.             $iReasonLengthConsumed, _
  160.             $tCloseReasonBuffer)
  161.     If @error Or $iError <> 0 Then
  162.         ConsoleWrite("QueryCloseStatus error" & @CRLF)
  163.         Return False
  164.     EndIf
  165.  
  166.     ConsoleWrite("The server closed the connection with status code: '" & $iStatus & "' and reason: '" & _
  167.             BinaryToString(BinaryMid(DllStructGetData($tCloseReasonBuffer, 1), 1, $iReasonLengthConsumed)) & "'" & @CRLF)
  168. EndFunc   ;==>Example
  169.  
  170. Func quit()
  171.     If $hRequest <> 0 Then
  172.         _WinHttpCloseHandle($hRequest)
  173.         $hRequest = 0
  174.     EndIf
  175.  
  176.     If $hWebSocket <> 0 Then
  177.         _WinHttpCloseHandle($hWebSocket)
  178.         $hWebSocket = 0
  179.     EndIf
  180.  
  181.     If $hConnect <> 0 Then
  182.         _WinHttpCloseHandle($hConnect)
  183.         $hConnect = 0
  184.     EndIf
  185.  
  186.     If $iError <> 0 Then
  187.         ConsoleWrite("Application failed with error: " & $iError & @CRLF)
  188.         Return -1
  189.     EndIf
  190.  
  191.     Return 0
  192. EndFunc
  193.  
  194. Func _WinHttpSetOptionNoParams($hInternet, $iOption)
  195.     Local $aCall = DllCall($hWINHTTPDLL__WINHTTP, "bool", "WinHttpSetOption", _
  196.             "handle", $hInternet, "dword", $iOption, "ptr", 0, "dword", 0)
  197.     If @error Or Not $aCall[0] Then Return SetError(4, 0, 0)
  198.     Return 1
  199. EndFunc   ;==>_WinHttpSetOptionNoParams
  200.  
  201. Func _WinHttpWebSocketCompleteUpgrade($hRequest, $pContext = 0)
  202.     Local $aCall = DllCall($hWINHTTPDLL__WINHTTP, "handle", "WinHttpWebSocketCompleteUpgrade", _
  203.             "handle", $hRequest, _
  204.             "DWORD_PTR", $pContext)
  205.     If @error Then Return SetError(@error, @extended, -1)
  206.     Return $aCall[0]
  207. EndFunc   ;==>_WinHttpWebSocketCompleteUpgrade
  208.  
  209. Func _WinHttpWebSocketSend($hWebSocket, $iBufferType, $vData)
  210.     Local $tBuffer = 0, $iBufferLen = 0
  211.     If IsBinary($vData) = 0 Then $vData = StringToBinary($vData)
  212.     $iBufferLen = BinaryLen($vData)
  213.     If $iBufferLen > 0 Then
  214.         $tBuffer = DllStructCreate("byte[" & $iBufferLen & "]")
  215.         DllStructSetData($tBuffer, 1, $vData)
  216.     EndIf
  217.  
  218.     Local $aCall = DllCall($hWINHTTPDLL__WINHTTP, "DWORD", "WinHttpWebSocketSend", _
  219.             "handle", $hWebSocket, _
  220.             "int", $iBufferType, _
  221.             "ptr", DllStructGetPtr($tBuffer), _
  222.             "DWORD", $iBufferLen)
  223.     If @error Then Return SetError(@error, @extended, -1)
  224.     Return $aCall[0]
  225. EndFunc   ;==>_WinHttpWebSocketSend
  226.  
  227. Func _WinHttpWebSocketReceive($hWebSocket, $tBuffer, ByRef $iBytesRead, ByRef $iBufferType)
  228.     Local $aCall = DllCall($hWINHTTPDLL__WINHTTP, "handle", "WinHttpWebSocketReceive", _
  229.             "handle", $hWebSocket, _
  230.             "ptr", DllStructGetPtr($tBuffer), _
  231.             "DWORD", DllStructGetSize($tBuffer), _
  232.             "DWORD*", $iBytesRead, _
  233.             "int*", $iBufferType)
  234.     If @error Then Return SetError(@error, @extended, -1)
  235.     $iBytesRead = $aCall[4]
  236.     $iBufferType = $aCall[5]
  237.     Return $aCall[0]
  238. EndFunc   ;==>_WinHttpWebSocketReceive
  239.  
  240. Func _WinHttpWebSocketClose($hWebSocket, $iStatus, $tReason = 0)
  241.     Local $aCall = DllCall($hWINHTTPDLL__WINHTTP, "handle", "WinHttpWebSocketClose", _
  242.             "handle", $hWebSocket, _
  243.             "USHORT", $iStatus, _
  244.             "ptr", DllStructGetPtr($tReason), _
  245.             "DWORD", DllStructGetSize($tReason))
  246.     If @error Then Return SetError(@error, @extended, -1)
  247.     Return $aCall[0]
  248. EndFunc   ;==>_WinHttpWebSocketClose
  249.  
  250. Func _WinHttpWebSocketQueryCloseStatus($hWebSocket, ByRef $iStatus, ByRef $iReasonLengthConsumed, $tCloseReasonBuffer = 0)
  251.     Local $aCall = DllCall($hWINHTTPDLL__WINHTTP, "handle", "WinHttpWebSocketQueryCloseStatus", _
  252.             "handle", $hWebSocket, _
  253.             "USHORT*", $iStatus, _
  254.             "ptr", DllStructGetPtr($tCloseReasonBuffer), _
  255.             "DWORD", DllStructGetSize($tCloseReasonBuffer), _
  256.             "DWORD*", $iReasonLengthConsumed)
  257.     If @error Then Return SetError(@error, @extended, -1)
  258.     $iStatus = $aCall[2]
  259.     $iReasonLengthConsumed = $aCall[5]
  260.     Return $aCall[0]
  261. EndFunc   ;==>_WinHttpWebSocketQueryCloseStatus
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement