Chilkat
HOME
Android™
ASP
Visual Basic
VB.NET
C#
iOS (IPhone)
Objective-C
C++
C
MFC
Delphi
FoxPro
Java
Perl
PHP Extension
PHP ActiveX
Python
PowerShell
Ruby
SQL Server
VBScript
|
Understanding Asynchronous SocketsDiscusses 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.
CREATE PROCEDURE ChilkatSample AS BEGIN DECLARE @hr int DECLARE @sTmp0 nvarchar(4000) DECLARE @socket int EXEC @hr = sp_OACreate 'Chilkat.Socket', @socket OUT IF @hr <> 0 BEGIN PRINT 'Failed to create ActiveX component' RETURN END DECLARE @success int EXEC sp_OAMethod @socket, 'UnlockComponent', @success OUT, 'Anything for 30-day trial' IF @success <> 1 BEGIN EXEC sp_OAGetProperty @socket, 'LastErrorText', @sTmp0 OUT PRINT @sTmp0 RETURN END 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 RETURN END -- Wait for the socket to become connected... EXEC sp_OAGetProperty @socket, 'AsyncConnectFinished', @sTmp0 OUT WHILE (@sTmp0 <> 1) BEGIN -- Sleep 1 second. EXEC sp_OAMethod @socket, 'SleepMs', NULL, 100 END -- Did the connect fail? EXEC sp_OAGetProperty @socket, 'AsyncConnectSuccess', @sTmp0 OUT IF @sTmp0 <> 1 BEGIN EXEC sp_OAGetProperty @socket, 'AsyncConnectLog', @sTmp0 OUT PRINT @sTmp0 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 RETURN END -- Wait for the send to finish EXEC sp_OAGetProperty @socket, 'AsyncSendFinished', @sTmp0 OUT WHILE (@sTmp0 <> 1) BEGIN -- Sleep 1 second. EXEC sp_OAMethod @socket, 'SleepMs', NULL, 100 END -- Did the send fail? EXEC sp_OAGetProperty @socket, 'AsyncSendSuccess', @sTmp0 OUT IF @sTmp0 <> 1 BEGIN EXEC sp_OAGetProperty @socket, 'AsyncSendLog', @sTmp0 OUT PRINT @sTmp0 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 RETURN END -- Wait for the background read to finish EXEC sp_OAGetProperty @socket, 'AsyncReceiveFinished', @sTmp0 OUT WHILE (@sTmp0 <> 1) BEGIN -- Sleep 1 second. EXEC sp_OAMethod @socket, 'SleepMs', NULL, 100 END -- Did the receive fail? EXEC sp_OAGetProperty @socket, 'AsyncReceiveSuccess', @sTmp0 OUT IF @sTmp0 <> 1 BEGIN EXEC sp_OAGetProperty @socket, 'AsyncReceiveLog', @sTmp0 OUT PRINT @sTmp0 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', NULL, 20000 END GO |
© 2000-2010 Chilkat Software, Inc. All Rights Reserved.