Encoding.ASCII.GetBytes similar for Python ?

2008-09-22 Thread Rui
Hi, how can i do what Encoding.ASCII.GetBytes (in .net, c#) does with
the strings. I am trying to query some dns server to check its
response using udp sockets. Some of the source below:

# encoding: utf8
import socket
import sys
import struct

IP_PORT = 53
server_host = ('4.2.2.1', IP_PORT)
transaction_id = Q1
TIMEOUT = 5

type_string =
\u0001\u\u\u0001\u\u\u\u\u\u
trailer_string = \u\u\u0001\u\u0001

address = 'google.com'
url_name_start, domain_name = address.split(.)

# Query format copied from the C# example.
#QueryString = TransactionID1 + TypeString + (char)URLNameStart.Length
+ URLNameStart + (char)DomainName.Length + DomainName+ TrailerString;
query =  (transaction_id + type_string + str(len(url_name_start)) +
url_name_start +
 str(len(domain_name)) + domain_name + trailer_string)
print query

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.settimeout(TIMEOUT)
sock.connect(server_host)

sock.send(query)
data = sock.recv(512)

for data_item in data:
try:
print chr(data_item)
except:
print data_item


But it just returns trash:

python dns_checker.py
Q1\u0001\u\u\u0001\u\u\u\u\u\u6google3com
\u\
u\u0001\u\u0001
Q
1
Ï
◄






Any advice ? Thanks!

--
http://mail.python.org/mailman/listinfo/python-list

Re: Encoding.ASCII.GetBytes similar for Python ?

2008-09-22 Thread Tino Wildenhain

Hi,

Rui wrote:

Hi, how can i do what Encoding.ASCII.GetBytes (in .net, c#) does with
the strings. I am trying to query some dns server to check its


What would it do?


response using udp sockets. Some of the source below:

# encoding: utf8
import socket
import sys
import struct

IP_PORT = 53
server_host = ('4.2.2.1', IP_PORT)
transaction_id = Q1
TIMEOUT = 5

type_string =
\u0001\u\u\u0001\u\u\u\u\u\u
trailer_string = \u\u\u0001\u\u0001

address = 'google.com'
url_name_start, domain_name = address.split(.)

# Query format copied from the C# example.
#QueryString = TransactionID1 + TypeString + (char)URLNameStart.Length
+ URLNameStart + (char)DomainName.Length + DomainName+ TrailerString;
query =  (transaction_id + type_string + str(len(url_name_start)) +
url_name_start +
 str(len(domain_name)) + domain_name + trailer_string)
print query


You should refrain from trying a 1:1 translation from one language
to another. This makes funny things with natural languages as well
as it is horribly with computer languages.

You should really read on string formatting in python.

Also, while indeed usefull to understand whats going on for production
use this is not recommended anymore, since you would have to randomize
ports for requests instead of using fixed 53UDP.

I'd recommend having a look on python adns - 
http://code.google.com/p/adns-python/






sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.settimeout(TIMEOUT)
sock.connect(server_host)

sock.send(query)
data = sock.recv(512)

for data_item in data:
try:
print chr(data_item) 


this is never going to work since recv() returns a string buffer, not
a list of integers.

HTH
Tino


smime.p7s
Description: S/MIME Cryptographic Signature
--
http://mail.python.org/mailman/listinfo/python-list

Re: Encoding.ASCII.GetBytes similar for Python ?

2008-09-22 Thread Marc 'BlackJack' Rintsch
On Mon, 22 Sep 2008 04:23:09 -0700, Rui wrote:

 Hi, how can i do what Encoding.ASCII.GetBytes (in .net, c#) does with
 the strings. I am trying to query some dns server to check its response
 using udp sockets. Some of the source below:
 
 # encoding: utf8
 import socket
 import sys
 import struct
 
 IP_PORT = 53
 server_host = ('4.2.2.1', IP_PORT)
 transaction_id = Q1
 TIMEOUT = 5
 
 type_string =
 \u0001\u\u\u0001\u\u\u\u\u\u
 trailer_string = \u\u\u0001\u\u0001

Are you sure you want normal byte strings with *that* content!?

In [90]: s = \u\u\u0001\u\u0001

In [91]: len(s)
Out[91]: 30

In [92]: print s
\u\u\u0001\u\u0001

This is not 5 unicode characters but 30 ASCII characters.  But why using 
unicode anyway?  I guess the DNS server expects bytes and not unicode 
characters.

 address = 'google.com'
 url_name_start, domain_name = address.split(.)
 
 # Query format copied from the C# example. #QueryString = TransactionID1
 + TypeString + (char)URLNameStart.Length + URLNameStart +
 (char)DomainName.Length + DomainName+ TrailerString; query = 
 (transaction_id + type_string + str(len(url_name_start)) +
 url_name_start +
  str(len(domain_name)) + domain_name + trailer_string)
 print query
 
 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
 sock.settimeout(TIMEOUT)
 sock.connect(server_host)
 
 sock.send(query)
 data = sock.recv(512)
 
 for data_item in data:
 try:
 print chr(data_item)
 except:
 print data_item

This will always end up in the ``except`` branch because `data` is a 
string and `chr()` expects integers.  Any chance you wanted `ord()` 
instead?

When you print out trash please use `repr()` so we can see what trash 
*exactly* you get.

Ciao,
Marc 'BlackJack' Rintsch
--
http://mail.python.org/mailman/listinfo/python-list