Chilkat HOME .NET Core C# Android™ AutoIt C C# C++ Chilkat2-Python CkPython Classic ASP DataFlex Delphi ActiveX Delphi DLL Go Java Lianja Mono C# Node.js Objective-C PHP ActiveX PHP Extension Perl PowerBuilder PowerShell PureBasic Ruby SQL Server Swift 2 Swift 3,4,5... Tcl Unicode C Unicode C++ VB.NET VBScript Visual Basic 6.0 Visual FoxPro Xojo Plugin
(AutoIt) Bidirectional Sockets (TLS or non-TLS, simultaneous reading and writing a connection)This example demonstrates how to simultaneously read/write on a single socket connection.
; This example requires the Chilkat API to have been previously unlocked. ; See Global Unlock Sample for sample code. $oTlsRead = ObjCreate("Chilkat.Socket") ; We'll just use an HTTPS server for this example... Local $bUseTls = True Local $iMaxWaitMs = 5000 Local $bSuccess = $oTlsRead.Connect("www.chilkatsoft.com",443,$bUseTls,$iMaxWaitMs) If ($bSuccess <> True) Then ConsoleWrite($oTlsRead.LastErrorText & @CRLF) Exit EndIf ; Chilkat classes are thread-safe. This means that only one method call can be active ; at a time for a given object instance. It would seem that this would prevent the possibility ; to simultaneously read/write a given connection because it would require two method calls ; to be simultaneously active: one for reading and one for writing. ; ; There's a trick to doing it... ; ; The CloneSocket method is provided to get a new object instance that shares the same socket ; connection. This allows for the coarse-grained object-level thread safety to be maintained, ; while finer-grained thread-safety mechanisms keep things kosher internally. ; One object will be used for reading, and the cloned socket is used for writing. ; It doesn't matter which -- you can use the cloned socket for reading or the original for writing. ; However.. if you try to read simultneously from both the original and cloned objects at the same ; time, then one will block until the other finishes. (This is because of the finer-grained thread ; safety internally.) The same is true if you try to write both socket objects simultaneously. Local $oTlsWrite = $oTlsRead.CloneSocket() ; Let's start an async read on the socket. Nothing will be arriving until we actually send the GET ; request and the server responds. This will read until the end of the HTTP response header. Local $oTask = $oTlsRead.ReceiveUntilMatchAsync(@CRLF & @CRLF) $oTask.Run() ; Now send the request. This should not block because the read is happening on the tlsRead object. Local $sHttpGetReq = "GET / HTTP/1.1" & @CRLF & "Host: www.chilkatsoft.com" & @CRLF & @CRLF $bSuccess = $oTlsWrite.SendString($sHttpGetReq) ; Assuming success for the example... ; Wait for the read task to finish. ; The True/False returned by Wait applies to the Wait method call, not the task. $iMaxWaitMs = 5000 $bSuccess = $oTask.Wait($iMaxWaitMs) If (Not $bSuccess Or ($oTask.StatusInt <> 7) Or ($oTask.TaskSuccess <> True)) Then If (Not $bSuccess) Then ; The task.LastErrorText applies to the Wait method call. ConsoleWrite($oTask.LastErrorText & @CRLF) Else ; The ResultErrorText applies to the underlying task method call (i.e. the Connect) ConsoleWrite($oTask.Status & @CRLF) ConsoleWrite($oTask.ResultErrorText & @CRLF) EndIf Exit EndIf ; Examine the received HTTP response header: ConsoleWrite("HTTP response header:" & @CRLF) ConsoleWrite($oTask.GetResultString() & @CRLF) ; We should get a response that looks like this: ; HTTP response header: ; HTTP/1.1 200 OK ; Cache-Control: private ; Content-Length: 7477 ; Content-Type: text/html ; Server: Microsoft-IIS/8.5 ; Set-Cookie: ASPSESSIONIDSWDSTRTQ=BBNMIKGCHFJNILFFPLDIOGDE; secure; path=/ ; X-Powered-By: ASP.NET ; X-Powered-By-Plesk: PleskWin ; Date: Thu, 06 Apr 2017 12:03:30 GMT ; Forget about the remainder of the HTTP response... The example was only to demonstrate ; simultaneous reading/writing.. $iMaxWaitMs = 20 $oTlsRead.Close($iMaxWaitMs) |
© 2000-2024 Chilkat Software, Inc. All Rights Reserved.