Sniffing at two sockets

n00m n00m at narod.ru
Tue Apr 26 15:39:12 EDT 2005


In a simple VB script I open ADODB.Connection and start sending
some very simple T-SQL commands to a MS SQL Server. Like this:

------------------------------------------------------------

Set cn = CreateObject("ADODB.Connection")
cn.Open _
"Provider=sqloledb;Data Source=127.0.0.1,1434;" & _
"Network Library=DBMSSOCN;Initial Catalog=pubs;" & _
"User ID=qwe;Password=asdasd;"

cn.Execute _
"select 'XXXXXXXXXXXX';" & _
"waitfor delay '00:00:03'; raiserror ('AAA',10,1) with nowait;" & _
"waitfor delay '00:00:03'; raiserror ('BBB',10,1) with nowait;" & _
"waitfor delay '00:00:03'; raiserror ('CCC',10,1) with nowait;" & _
"waitfor delay '00:00:03'; select 'YYYYYYYYYYYY';"

------------------------------------------------------------
BUT I do it (sending to\fro data) via two sockets opened in a python
code. Note: in above connection string I direct VB script to port 1434,
BUT the SQL Server listens to its default port = 1433.
Here my python code:
------------------------------------------------------------

import socket
host, port = '127.0.0.1', 1434
s1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s2.connect((host, 1433))
s1.bind((host, port))
s1.listen(1)
cn, addr = s1.accept()
while 1:
    data = cn.recv(4096)
    if not data: break
    s2.send(data)
    print 'VB_SCRIPT:', data
    data = s2.recv(4096)
    if not data: break
    cn.send(data)
    print 'SQL_SERVER:', data
cn.close()
s1.close()
s2.close()

------------------------------------------------------------
And in the 0-approximation everything works just fine! I can
see printed intercepted requests\replies from VBS\SQLServer.
BUT alas it does not work EXACTLY as it works if the VB script
"connects" DIRECTLY to the "true" SQL Server's port = 1433.

After receiving the first error_message 'AAA' the VBS should
immediately issue something like 'Ready to receive next packet'
(in my newbish understanding), BUT instead it gets frozen till
its CommandTimeout times out and only then it wakes up, issues
a final request and gets ALL data that SQL Server "accumulated"
for the client's side; namely, error_messages 'BBB' and 'CCC'
and result of "select 'YYYYYYYYYYYY'".

ANY IDEAS WHY IT WORKS NOT QUITE CORRECTLY WILL BE GREATLY
APPRECIATED!!!




More information about the Python-list mailing list