네트워크 스택에서 IP 패킷을 스니핑하기위한 다음 코드 샘플이있는 .NET의 네트워크 프로그래밍이라는 책이 있습니다. 그래서 문체 규칙의 부족을 용서하시기 바랍니다 책에서 코드 샘플 WORD-FOR-WORD를 복사 한 등.NET에서 네트워크 패킷 스니핑 사용 권한 예외
List<string> packets = new List<string>();
public void Run()
{
int len_receive_buf = 4096;
int len_send_buf = 4096;
byte[] receive_buf = new byte[len_receive_buf];
byte[] send_buf = new byte[len_send_buf];
int cout_receive_bytes;
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
socket.Blocking = false;
IPHostEntry IPHost = Dns.GetHostByName(Dns.GetHostName());
socket.Bind(new IPEndPoint(IPAddress.Parse(IPHost.AddressList[0].ToString()), 0));
socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, 1);
byte[] IN = new byte[4] { 1, 0, 0, 0 };
byte[] OUT = new byte[4];
int SIO_RCVALL = unchecked((int)0x98000001);
int ret_code = socket.IOControl(SIO_RCVALL, IN, OUT);
while(true)
{
IAsyncResult ar = socket.BeginReceive(receive_buf, 0, len_receive_buf, SocketFlags.None, null, this);
cout_receive_bytes = socket.EndReceive(ar);
Receive(receive_buf, cout_receive_bytes);
}
}
public void Receive(byte[] buf, int len)
{
if(buf[9] == 6)
{
packets.Add(Encoding.ASCII.GetString(buf).Replace("\0", " "));
}
}
첫 번째 나는 (심지어 비스타가 존재하기 전에)이 몇 년 전 테스트 시간과 내가 사용했던 컴퓨터는 IPv4에서 실행되는 NIC가있는 32 비트 Windows XP Proferssional 플랫폼이었습니다.
이제 IPv6를 실행하는 NIC가있는 64 비트 Windows 7 플랫폼에서 테스트하려고하지만 작동하지 않습니다. 나는 이것이 IPv6과 관련이 있다고 가정하고있다. 누구든지이 문제를 어떻게 효과적으로 해결할 수 있을지 제안 할 수 있습니까?
편집 :이
어떻게 작동하지 않습니까? –
'IPAddress.Parse (IPHost.AddressList [0] .ToString()) '과 같은 보석을 포함하는 코드의 저자에 대해 진지하게 질문 할 것입니다. 단지'IPHost.AddressList [0]'뿐 아니라 왜? –
@Damien_The_Unbeliever 나는 꽤 동의한다! – series0ne