Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > sending binary data over sockets

Reply
Thread Tools

sending binary data over sockets

 
 
thorley@gmail.com
Guest
Posts: n/a
 
      07-03-2006
Greetings, since there was no reponse to my previous post about an
existing FastCGI server in python, I've taken to writing my own. (which
of course I'll share--*if* there's something to share

My problem now, is that I need to send certain binary data over a
socket. That is, I want to make some bytes, and stuff them in a TCP
packet, send them down the pipe, and then listen for a response.

socket.send, as best I can tell, will only send strings. I've read on
the list other conversations where the recommendation was to use xdrlib
or struct. But it appears that is only useful when you control the
client and the server. PLEASE correct me if I'm wrong, but using struct
just encodes the binary data as a string, right?

# Example sending binary data as a string
s = socket.socket()
s.connect(("127.0.0.1", 8000))
packet = struct.pack('4B', 1, 2, 3, 4)
s.send(packet)

In my understaing the above just sends the string '\x01\x02\x03\x04',
not raw binary data. I've looked at Billy the Kid and pcap, which are
cool but not what I need.

Do I have to build my own packets from scratch and encode all the
TCP/IP headers myself to get this to work?

Solutions and Corrections welcome and appreciated.
Thanks very much

--
matthew

 
Reply With Quote
 
 
 
 
Diez B. Roggisch
Guest
Posts: n/a
 
      07-03-2006
http://www.velocityreviews.com/forums/(E-Mail Removed) schrieb:
> Greetings, since there was no reponse to my previous post about an
> existing FastCGI server in python, I've taken to writing my own. (which
> of course I'll share--*if* there's something to share
>
> My problem now, is that I need to send certain binary data over a
> socket. That is, I want to make some bytes, and stuff them in a TCP
> packet, send them down the pipe, and then listen for a response.
>
> socket.send, as best I can tell, will only send strings. I've read on
> the list other conversations where the recommendation was to use xdrlib
> or struct. But it appears that is only useful when you control the
> client and the server. PLEASE correct me if I'm wrong, but using struct
> just encodes the binary data as a string, right?


WHich is perfectly alright, as
 
Reply With Quote
 
 
 
 
Diez B. Roggisch
Guest
Posts: n/a
 
      07-03-2006
Premature sending syndrome...

Diez B. Roggisch schrieb:
> (E-Mail Removed) schrieb:
>> Greetings, since there was no reponse to my previous post about an
>> existing FastCGI server in python, I've taken to writing my own. (which
>> of course I'll share--*if* there's something to share
>>
>> My problem now, is that I need to send certain binary data over a
>> socket. That is, I want to make some bytes, and stuff them in a TCP
>> packet, send them down the pipe, and then listen for a response.
>>
>> socket.send, as best I can tell, will only send strings. I've read on
>> the list other conversations where the recommendation was to use xdrlib
>> or struct. But it appears that is only useful when you control the
>> client and the server. PLEASE correct me if I'm wrong, but using struct
>> just encodes the binary data as a string, right?


Python strings are binary data and can contain
- in oppostion to e.g. C-strings - null-bytes.

So it is perfectly alright to send "only" strings over a socket.

Diez
 
Reply With Quote
 
Sukanta
Guest
Posts: n/a
 
      07-03-2006
(E-Mail Removed) wrote:
> Greetings, since there was no reponse to my previous post about an
> existing FastCGI server in python, I've taken to writing my own. (which
> of course I'll share--*if* there's something to share
>
> My problem now, is that I need to send certain binary data over a
> socket. That is, I want to make some bytes, and stuff them in a TCP
> packet, send them down the pipe, and then listen for a response.
>
> socket.send, as best I can tell, will only send strings. I've read on
> the list other conversations where the recommendation was to use xdrlib
> or struct. But it appears that is only useful when you control the
> client and the server. PLEASE correct me if I'm wrong, but using struct
> just encodes the binary data as a string, right?
>
> # Example sending binary data as a string
> s = socket.socket()
> s.connect(("127.0.0.1", 8000))
> packet = struct.pack('4B', 1, 2, 3, 4)
> s.send(packet)
>
> In my understaing the above just sends the string '\x01\x02\x03\x04',
> not raw binary data. I've looked at Billy the Kid and pcap, which are
> cool but not what I need.
>


It will send the 4 bytes, binary, and not the string as you assumed. If
you want to satisfy yourself, run tcpdump (or ethereal) to observe what
is being sent.


> Do I have to build my own packets from scratch and encode all the
> TCP/IP headers myself to get this to work?
>
> Solutions and Corrections welcome and appreciated.
> Thanks very much
>
> --
> matthew


 
Reply With Quote
 
Grant Edwards
Guest
Posts: n/a
 
      07-03-2006
On 2006-07-03, (E-Mail Removed) <(E-Mail Removed)> wrote:

> My problem now, is that I need to send certain binary data over a
> socket. That is, I want to make some bytes, and stuff them in a TCP
> packet, send them down the pipe, and then listen for a response.
>
> socket.send, as best I can tell, will only send strings. I've read on
> the list other conversations where the recommendation was to use xdrlib
> or struct. But it appears that is only useful when you control the
> client and the server. PLEASE correct me if I'm wrong, but using struct
> just encodes the binary data as a string, right?


Right. Strings are binary data.

> # Example sending binary data as a string
> s = socket.socket()
> s.connect(("127.0.0.1", 8000))
> packet = struct.pack('4B', 1, 2, 3, 4)
> s.send(packet)
>
> In my understaing the above just sends the string '\x01\x02\x03\x04',
> not raw binary data.


The string '\x01\x02\x03\x04' consists of four octets having
the values 0x01, 0x02, 0x03, 0x04.

Are those not the four octets you wanted to send?

--
Grant Edwards grante Yow! I want EARS! I
at want two ROUND BLACK
visi.com EARS to make me feel warm
'n secure!!
 
Reply With Quote
 
thorley@gmail.com
Guest
Posts: n/a
 
      07-03-2006
> Python strings are binary data and can contain
> - in oppostion to e.g. C-strings - null-bytes.
>
> So it is perfectly alright to send "only" strings over a socket.


Agreed. I wasn't trying to imply it was 'wrong' just that the receiving
application wouldn't interpret strings correctly.

 
Reply With Quote
 
thorley@gmail.com
Guest
Posts: n/a
 
      07-03-2006
> It will send the 4 bytes, binary, and not the string as you assumed. If
> you want to satisfy yourself, run tcpdump (or ethereal) to observe what
> is being sent.


Thanks very much for the prompt reply. I'll take your word for it. I
actually tried ethereal to verify my hypothesis before posting, but
wasn't able to see the raw data bytes. That's probably just a
deficiancy in my ability to steer ethereal.

thanks again
--
matthew

 
Reply With Quote
 
thorley@gmail.com
Guest
Posts: n/a
 
      07-03-2006
> Are those not the four octets you wanted to send?

Yes. My understanding of struct was broken. Sukanta corrected it for
me.

thank you
--
matthew

 
Reply With Quote
 
Scott David Daniels
Guest
Posts: n/a
 
      07-03-2006
(E-Mail Removed) wrote:
> Greetings, since there was no reponse to my previous post about an
> existing FastCGI server in python, I've taken to writing my own. (which
> of course I'll share--*if* there's something to share
>
> My problem now, is that I need to send certain binary data over a
> socket. That is, I want to make some bytes, and stuff them in a TCP
> packet, send them down the pipe, and then listen for a response.


As everyone else has already told you, you have a misconception about
strings and struct and so on. However, if what you want is mutability
in a pattern, read the array module documentation as well.

--Scott David Daniels
(E-Mail Removed)
 
Reply With Quote
 
Simon Forman
Guest
Posts: n/a
 
      07-04-2006
Grant Edwards wrote:
> On 2006-07-03, (E-Mail Removed) <(E-Mail Removed)> wrote:
>
> > My problem now, is that I need to send certain binary data over a
> > socket. That is, I want to make some bytes, and stuff them in a TCP
> > packet, send them down the pipe, and then listen for a response.

....
> > In my understaing the above just sends the string '\x01\x02\x03\x04',
> > not raw binary data.

>
> The string '\x01\x02\x03\x04' consists of four octets having
> the values 0x01, 0x02, 0x03, 0x04.
>
> Are those not the four octets you wanted to send?
>
> --
> Grant Edwards


i.e.
>>> len('\x01\x02\x03\x04')

4

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
VOIP over VPN over TCP over WAP over 3G Theo Markettos UK VOIP 2 02-14-2008 03:27 PM
Sending binary data over CGI Walter Huf Python 3 03-04-2004 11:07 PM
Re: sending objects over sockets Knute Johnson Java 5 06-28-2003 03:29 PM
Re: sending objects over sockets Steve Horsley Java 0 06-27-2003 01:51 PM
Re: sending objects over sockets Steve Horsley Java 0 06-27-2003 01:51 PM



Advertisments