SQL Server Stored Procedure Examples

ChilkatHOMEAndroid™ASPVisual BasicVB.NETC#iOS (IPhone)Objective-CC++CMFCDelphiFoxProJavaPerl
PHP ExtensionPHP ActiveXPythonPowerShellRubySQL ServerVBScript

SQL Server
Stored Procedure Examples

Quick Start
Encryption
File Access
IMAP
POP3
SMTP
Email Object
DKIM / DomainKey
FTP
HTML Conversion
HTTP
MHT
MIME
NTLM
RSA
Diffie-Hellman
DSA
Socket
Spider
SSH Key
SSH
SSH Tunnel
SFTP
String
Tar
Upload
XML
XMP
Zip

Amazon S3
Bz2
CSV
FileAccess
Byte Array
RSS
Atom
Self-Extractor

Understanding Asynchronous Sockets

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.

Download Chilkat Socket ActiveX

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.