![]() |
Chilkat HOME Android™ AutoIt C C# C++ Chilkat2-Python CkPython Classic ASP DataFlex Delphi DLL Go Java Node.js Objective-C PHP Extension Perl PowerBuilder PowerShell PureBasic Ruby SQL Server Swift Tcl Unicode C Unicode C++ VB.NET VBScript Visual Basic 6.0 Visual FoxPro Xojo Plugin
(SQL Server) (Deprecated) Asynchronous SocketsNotice: The functionality described here is deprecated and replaced by a newer model for asynchronous method calls. The newer model was introduced in Chilkat v9.5.0.52, and is identified by methods having names ending in “Async” which return a task object. Discusses how asynchronous sockets (in Chilkat) are used for reading, writing, connecting, and accepting connections. The same code works for both SSL/TLS and non-SSL/TLS (unencrypted) sockets.
-- Important: See this note about string length limitations for strings returned by sp_OAMethod calls. -- CREATE PROCEDURE ChilkatSample AS BEGIN DECLARE @hr int DECLARE @iTmp0 int -- Important: Do not use nvarchar(max). See the warning about using nvarchar(max). DECLARE @sTmp0 nvarchar(4000) -- Notice: The functionality described here is deprecated and replaced -- by a newer model for asynchronous method calls. The newer model was -- introduced in Chilkat v9.5.0.52, and is identified by methods -- having names ending in “Async” which return a task object. -- This example requires the Chilkat API to have been previously unlocked. -- See Global Unlock Sample for sample code. DECLARE @socket int -- Use "Chilkat_9_5_0.Socket" for versions of Chilkat < 10.0.0 EXEC @hr = sp_OACreate 'Chilkat.Socket', @socket OUT IF @hr <> 0 BEGIN PRINT 'Failed to create ActiveX component' RETURN END DECLARE @success int DECLARE @useSsl int SELECT @useSsl = 0 DECLARE @maxWaitMillisec int SELECT @maxWaitMillisec = 20000 -- The remote hostname may be an IP address, a domain name, -- or "localhost". You'll need to change this: DECLARE @remoteHost nvarchar(4000) SELECT @remoteHost = '123.123.88.88' DECLARE @remotePort int SELECT @remotePort = 8125 -- The meaning of "asynchronous" is that the socket operation, whether -- it be a read, write, connect, or accept, happens in a background -- thread and thus leaves your application free to do something -- else while the socket operation is running. -- -- Note: If your application is simply going to initiate an asynchronous operation -- and do nothing except wait for it to complete, then it may as -- well use the synchronous socket methods -- there's no point in adding -- complexity to your application if it's not necessary. The meaning of "synchronous" -- is that the method call (for reading, writing, connecting, accepting) does not -- return until the socket operation is complete. -- -- All asynchronous socket operations follow these basic steps: -- 1) Initiate the asynchronous socket operation. This starts a background thread -- that does the work. The method called to initiate the asynchronous operation -- returns immediately. -- 2) Wait until the operation is completed by periodically examining the -- "Finished" property. Each type of socket operation has it's own "Finished" property, such as AsyncReceiveFinished. -- Once it becomes 1 or 0, you may check the "Success" property (see next step). -- 3) Once finished, you may check the "Success" property to see if the asynchronous operation -- succeeded or failed. Each type of socket operation has it's own "Success" property, -- such as AsynchReceiveSuccess. -- 4) If it failed, the error information is available in the "Log" property, such as "AsyncReceiveLog". -- 5) If success, then the return data is available in another property (see below). -- ------------------------------------------------------------------------- -- Asynchronous Socket Methods and Properties -- ------------------------------------------------------------------------- -- -- -------------------- -- Receiving Data: -- -------------------- -- -- Methods for initiating a background receive: -- AsyncReceiveBytes -- AsyncReceiveBytesN -- AsyncReceiveString -- AsyncReceiveToCRLF -- AsyncReceiveUntilMatch -- Properties: -- AsyncReceiveFinished - Becomes 1 when completed. -- AsyncReceiveSuccess - Set to 1 or 0 when finished. -- AsyncReceiveLog - Error information if failed. -- AsyncReceivedBytes - Data received if receiving binary data. -- AsyncReceivedString -- Data received if receiving a string. -- -- -------------------- -- Sending Data: -- -------------------- -- -- Methods for initiating a background send: -- AsyncSendBytes -- AsyncSendString -- Properties: -- AsyncSendFinished - Becomes 1 when completed. -- AsyncSendSuccess - Set to 1 or 0 when finished. -- AsyncSendLog - Error information if failed. -- -------------------- -- Making a TCP Connection: -- -------------------- -- -- Method for initiating a background connect: -- AsyncConnectStart -- Properties: -- AsyncConnectFinished - Becomes 1 when completed. -- AsyncConnectSuccess - Set to 1 or 0 when finished. -- AsyncConnectLog - Error information if failed. -- -------------------- -- Accepting an Incoming a TCP Connection: -- -------------------- -- -- Method for initiating a background accept: -- AsyncAcceptStart -- Properties: -- AsyncAcceptFinished - Becomes 1 when completed. -- AsyncAcceptSuccess - Set to 1 or 0 when finished. -- AsyncAcceptLog - Error information if failed. -- -- ** After AsyncAcceptFinished becomes 1 *and* AsyncAcceptSuccess -- is 1, the connected socket may be retrieved by calling AsyncAcceptSocket. -- -------------------- -- DNS Lookup -- -------------------- -- -- Method for initiating a background DNS lookup: -- AsyncDnsStart -- Properties: -- AsyncDnsFinished - Becomes 1 when completed. -- AsyncDnsSuccess - Set to 1 or 0 when finished. -- AsyncDnsLog - Error information if failed. -- AsyncDnsResult - The IP address of the DNS lookup if successful. -- The following code demonstrates connecting, sending, and receiving asynchronously. -- NOTE: This example simply waits for each background operation -- to complete. In general, the whole point of doing something -- asynchronously is so your application is free to do other things, -- such as manage the user-interface. -- Connect to the remote host asynchronously in a background thread. EXEC sp_OAMethod @socket, 'AsyncConnectStart', @success OUT, @remoteHost, @remotePort, @useSsl, @maxWaitMillisec IF @success <> 1 BEGIN EXEC sp_OAGetProperty @socket, 'LastErrorText', @sTmp0 OUT PRINT @sTmp0 EXEC @hr = sp_OADestroy @socket RETURN END -- Wait for the socket to become connected... EXEC sp_OAGetProperty @socket, 'AsyncConnectFinished', @iTmp0 OUT WHILE (@iTmp0 <> 1) BEGIN -- Sleep 1 second. EXEC sp_OAMethod @socket, 'SleepMs', NULL, 100 END -- Did the connect fail? EXEC sp_OAGetProperty @socket, 'AsyncConnectSuccess', @iTmp0 OUT IF @iTmp0 <> 1 BEGIN EXEC sp_OAGetProperty @socket, 'AsyncConnectLog', @sTmp0 OUT PRINT @sTmp0 EXEC @hr = sp_OADestroy @socket RETURN END -- Set maximum timeouts for reading an writing (in millisec) EXEC sp_OASetProperty @socket, 'MaxReadIdleMs', 20000 EXEC sp_OASetProperty @socket, 'MaxSendIdleMs', 20000 -- Send a "Hello Server! -EOM-" message: EXEC sp_OAMethod @socket, 'AsyncSendString', @success OUT, 'Hello Server! -EOM-' IF @success <> 1 BEGIN EXEC sp_OAGetProperty @socket, 'LastErrorText', @sTmp0 OUT PRINT @sTmp0 EXEC @hr = sp_OADestroy @socket RETURN END -- Wait for the send to finish EXEC sp_OAGetProperty @socket, 'AsyncSendFinished', @iTmp0 OUT WHILE (@iTmp0 <> 1) BEGIN -- Sleep 1 second. EXEC sp_OAMethod @socket, 'SleepMs', NULL, 100 END -- Did the send fail? EXEC sp_OAGetProperty @socket, 'AsyncSendSuccess', @iTmp0 OUT IF @iTmp0 <> 1 BEGIN EXEC sp_OAGetProperty @socket, 'AsyncSendLog', @sTmp0 OUT PRINT @sTmp0 EXEC @hr = sp_OADestroy @socket RETURN END -- The server (in this example) is going to send a "Hello Client! -EOM-" -- message. Begin reading asynchronously in a background thread: EXEC sp_OAMethod @socket, 'AsyncReceiveUntilMatch', @success OUT, '-EOM-' IF @success <> 1 BEGIN EXEC sp_OAGetProperty @socket, 'LastErrorText', @sTmp0 OUT PRINT @sTmp0 EXEC @hr = sp_OADestroy @socket RETURN END -- Wait for the background read to finish EXEC sp_OAGetProperty @socket, 'AsyncReceiveFinished', @iTmp0 OUT WHILE (@iTmp0 <> 1) BEGIN -- Sleep 1 second. EXEC sp_OAMethod @socket, 'SleepMs', NULL, 100 END -- Did the receive fail? EXEC sp_OAGetProperty @socket, 'AsyncReceiveSuccess', @iTmp0 OUT IF @iTmp0 <> 1 BEGIN EXEC sp_OAGetProperty @socket, 'AsyncReceiveLog', @sTmp0 OUT PRINT @sTmp0 EXEC @hr = sp_OADestroy @socket RETURN END -- Display the received message: EXEC sp_OAGetProperty @socket, 'AsyncReceivedString', @sTmp0 OUT PRINT @sTmp0 -- Close the connection with the server -- Wait a max of 20 seconds (20000 millsec) EXEC sp_OAMethod @socket, 'Close', @success OUT, 20000 EXEC @hr = sp_OADestroy @socket END GO |
||||
© 2000-2026 Chilkat Software, Inc. All Rights Reserved.