title: Can I write Ethernet based network programs in C++?
body: <p>I would like to write a program and run it on two machines, and send some data from one machine to another in an Ethernet frame. </p>
  
  <p>Typically application data is at layer 7 of the OSI model, is there anything like a kernel restriction or API restriction, that would stop me from writing a program in which I can specify a destination MAC address and have some data sent to that MAC as the Ethernet payload? Then write a program to listen for incoming frames and grab the frames from a specified source MAC address, extracting the payload of data from the frame?</p>
  
  <p>(So I don't want any other overhead like IP or TCP/UDP headers, I don't want to go higher than layer 2).</p>
  
  <p>Can this be done in C++, or must all communication happen at the IP layer, and can this be done on Ubuntu? Extra love for pointing or providing examples! :D</p>
  
  <p>My problem is obviously I'm new to network programming in c++ and as far as I know, if I want to communicate across a network I have to use a <code>socket()</code> call or similar, which works at an IP layer, so can I write a c++ program to work at OSI layer 2, are there APIs for this, does the Linux kernel even allow this?</p>