title: How do I send a raw ethernet frame in python?
body: <p>I need to have a project done in a few days, its a basic client and server interface. The catch is that it needs to be all raw sockets. I have no problem with creating that, I am just stuck on sending the packets. </p>
  
  <p>First I tried to bind it to an interface <em>'en1'</em> but it keeps giving me an error <code>nodename not known</code>. When I bind it to my local ip address it works fine. After completing this I created a raw packet class, its all in hex. I then did a sendto call to send it on the wire.</p>
  
  <p>The problem is that when I capture the packet by using wireshark it shows up as being the payload of a ipv4 packet. I don't want it to make the headers automatically, that is what my raw packet class was for anyway. Do you know of any way I can take out these headers? </p>
  
  <p>Here is my code - only the raw function:</p>
  
  <pre><code>def raw():
      HOST = gethostbyname('192.168.1.10')
  
      s = socket(AF_INET, SOCK_RAW, IPPROTO_IP)
      s.bind((HOST, 0))
  
      s.setsockopt(IPPROTO_IP, IP_HDRINCL, 0) #no headers - it wont work!!
  
      pckt = packet("\x68\x65\x6c\x6c\x6f")
      netpacket = pckt.getpacket()
  
      print "Sending.. "
      print ""
  
      s.sendto(netpacket, ('192.168.1.1', 80))
      data = s.recv(4096)
      print data
  </code></pre>
  
  <p>And here is the captured packet with a <em>hello</em> at the end:</p>
  
  <pre><code>007f 2809 6da2 28cf daee 2156 0800 4500 004d 1bfc 0000 4000 db59 c0a8 010a c0a8 0101* 007f     
  
  2809 6da2 28cf daee 2156 0800 4500 0036 2352 4000 4006 0000 c0a8 010a c0a8 0101 15c0 0050 
  
  0000 0000 0000 0000 8010 813b 0000 68656c6c6f -hello
  </code></pre>
  
  <p>*This (the <code>0101</code>) is the start of the payload even though it was supposed to be the start of the packet. Also I am not going to use any other modules, I have to use socket.</p>