2013-06-16 10 views
1

안드로이드 장치가 C#의 간단한 ARP 요청 (내 랩톱에서 ARP를 C#으로 안드로이드 장치로 보내는 중)을 사용하여 라우터라고 생각하게하려고합니다. 나는 내가, it'l 일 (Iphlpapi.dll에서) SendArp 방법을 사용 있을지 생각 :.C#의 ARP 요청

SendArp(ConvertIPToInt32(IPAddress.Parse("myAndroidIP")), 
    ConvertIPToInt32(IPAddress.Parse("192.168.1.1")), macAddr, ref macAddrLen) 

을하지만 요청을 보낼 수 없습니다 * 그러나, 나는 쓸 것이다 경우 '0' 대신 ConvertIPToInt32(IPAddress.Parse("192.168.1.1"))의 :

SendArp(ConvertIPToInt32(IPAddress.Parse("myAndroidIP")), 0, 
    macAddr, ref macAddrLen) 

그것은 작동합니다

enter image description here

그래서 소스 IP가 '0'인 경우, 그것은 노력하고 있지만, 소스는 라우터의 IP A는 경우 ddress, 그 NOT.

나는 ARP를 보내려면이의 PInvoke 방법을 사용하고 있습니다 :

[System.Runtime.InteropServices.DllImport("Iphlpapi.dll", EntryPoint = "SendARP")] 
internal extern static Int32 SendArp(Int32 destIpAddress, Int32 srcIpAddress, 
byte[] macAddress, ref Int32 macAddressLength); 

그리고이 방법을 INT32에 문자열을 IP로 변환하기 :

private static Int32 ConvertIPToInt32(IPAddress pIPAddr) 
{ 
byte[] lByteAddress = pIPAddr.GetAddressBytes(); 
return BitConverter.ToInt32(lByteAddress, 0); 
} 

감사합니다.

+0

1 단계는 오류 검사를 추가하는 것입니다. 'SendARP'는 당신이 무시하는 반환 값을 가지고 있습니다. 그러지 마. 반환되는 값을 알려주십시오. –

답변

1

두 번째 매개 변수의 의미를 잘못 이해했다고 생각합니다.

1) ARP 요청이 특정 IP (예 : Android 기기)가 아닌 네트워크의 모든 컴퓨터로 전송됩니다.

2) SendARP function의 설명을 살펴보면 두 번째 매개 변수는 대상 IP가 아닌 인터페이스 IP입니다. 올바르게 이해하면 컴퓨터에 LAN 카드가 두 개 이상있는 경우 ARP 요청을 보낼 카드를 선택할 수 있습니다.

SrcIP [in] 보낸 사람의 소스 IPv4 주소 IPAddr 구조 형식. 이 매개 변수는 선택 사항이며 ARP 항목에 대한 요청을 보내기 위해 인터페이스를 선택하는 데 사용됩니다. 호출자는이 매개 변수의 INADDR_ANY IPv4 주소에 해당하는 0을 지정하면 이 될 수 있습니다.

+0

http://www.pinvoke.net/default.aspx/iphlpapi.sendarp 페이지 맨 위에있는 C# 서명을 살펴보십시오. – c0ldsh3ll

+0

@ C0LDSH3LL 좋아, 나는 보았다. 그리고 거기에서 다른 무엇? – VladL

+0

pinvoke.net는 참조하지 않습니다. 실제로 그것은 종종 잘못되거나 적어도 오도 된 것입니다. pinvoke.net은 .net 시그니처를 신속하게 결정할 수있는 도움이 될 수 있지만 함수의 실제 문서를 읽고 이해할 수 없다면 pInvoke를 전혀 사용하지 않아야합니다. –