On 2008-04-01, Stephen Cattaneo <[EMAIL PROTECTED]> wrote: >>> I am relatively new to socket programming. I am attempting to >>> use raw sockets to spoof my IP address. >> >> Don't bother to try... > > Is there a better solution to spoofing my IP. then using raw > sockets
You'll have to define "spoofing my IP", but I suspect that what you're trying can't be done by using raw sockets. > (I'm working on a machine with multiple interfaces and need to > be able to some how specify which interface that traffic needs > to be sent/recieved to/from) That's what routing tables are for. If you want to send packets using a particular IP, then configure an interface so that it has that adrress, and then bind your socket to that address. > The source of my confusion is that I need to keep my bytes formated > correctly. I am using the below 'raw socket example' proof-of-concept > code as my example. OK. > (And yes, I have tried the proof-of-concept. It works > correctly. It is not my code.) I know. It's my code. :) I wrote Python's raw socket support code and the example code that is floating around the 'net. > dstAddr = "\x01\x02\x03\x04\x05\x06" > dstAddr1 = "0x010203040506" > dstAddr != dstAddr1 Right. > Follow up question: What is the best to store my bytes up > until sending the packets? That depends on what you want to do with them. Ultimately, they need to be strings when they're sent out the socket (in Python a "string" is really just an array of 8-bit bytes). The best way to store them is entirely dependent on how you want to manipulate them before they're sent. > Perhaps I should use lists of decimal numbers and then > before sending convert to hex. Again: you're not converting them to hex. You're converting them to a python "string" object which is really just an array of bytes. Stop saying "hex" when you're talking about a string (array of bytes). "hex" is a way to _represent_ a value textually. It's simply a format used when print a value on paper or a screen. The value itself isn't hex any more than a particular instance of Canis lupus familiaris is "English" because somebody spells it "dog" instead of "chien" or "Hund". > I.E. dstAddr = [ 1, 2, 3, 4, 5, 6] > dstAddr.prepareToSend() I presume you know that list objects don't have a method called prepareToSend(). > txFrame = struct.pack("!6s6sh",dstAddr,srcAddr,proto) + ethData > > Is there a better way to do this? It's not at all clear what "this" is. If you want to convert from a list (or any sequence, really) of integer objects to a string where each integer is converted into a single byte within the string, then here are a few ways: import operator import struct intlist = [1,2,3,4,5,6] s1 = ''.join(chr(b) for b in intlist) s2 = reduce(operator.add,[chr(b) for b in intlist]) s3 = struct.pack("6B",*tuple(intlist)) print repr(s1) print repr(s2) print repr(s3) print s1==s2 print s2==s3 When run you get this: '\x01\x02\x03\x04\x05\x06' '\x01\x02\x03\x04\x05\x06' '\x01\x02\x03\x04\x05\x06' True True I think the third alternative using struct.pack() is the most readable, but others will no doubt disagree. -- Grant Edwards grante Yow! I'm GLAD I at remembered to XEROX all visi.com my UNDERSHIRTS!! -- http://mail.python.org/mailman/listinfo/python-list