wenn du rausfinden willst warum dein code nicht funzt solltest du mal bei jeder zeile mit einem winsock-kommando den rückgabewert (typ INTEGER, nicht boolean) auf SOCKET_ERROR prüfen, und falls dem so ist die WSAGetLastError msg anzeigen lassen
bzgl wie mahct ethereal das:
http://winpcap.polito.it
und btw: raw sockets mit winsock kann man nur mit admin rechten ausführen, was das ganze sehr unattraktiv macht