2012-01-12 90 views
1

當前正在嘗試實現一個簡單的ping程序,教我自己關於C#和.NET中的網絡編程。C#原始套接字接收數據包

我設法初始化一個原始套接字並正確地建立一個ICMP迴應請求數據包。在運行我的程序時,Wireshark確認我正在向所需的目標發送一個Echo請求,但是遠程機器永遠不會發回回應應答。我已經嘗試發送到多臺機器都具有相同的結果(並可以使用Windows ping實用程序ping每臺機器)。我的代碼是這樣的:

IcmpPacket echoReq = new IcmpPacket; 
/*Some code to initialize packet*/ 
rawSocket.Send(echoReq, destinationIP); //syntax may be wrong, dont have the code infront of me sorry 
rawSocket.ReceiveFrom(buffer, remoteEndpoint); 

如果任何人都可以說明爲什麼在遠程機器不發送任何迴應任何理由,我會非常感激。

+1

即使Wireshark將其標識爲ICMP回顯請求,數據包也必須有問題。想到的最可能的罪魁禍首是頭校驗和(IP和ICMP)。你檢查過那些嗎? Wireshark應該告訴你它是否認爲它是正確的。 – Celada 2012-01-12 16:07:43

+2

您發送的請求與Windows Ping實用程序發送的請求之間是否有區別?你也可以用wireshark來嗅探那些人。如果你發現差異,你可能會發現你的問題。 – AVee 2012-01-12 16:08:08

+0

您可能會發現檢查Microsoft的「Ping」實現是否有用。請參閱[參考源](http://referencesource.microsoft)中的\ Source \ .Net \ 4.0 \ DEVDIV_TFS \ Dev10 \ Releases \ RTMRel \ ndp \ fx \ src \ Net \ System \ Net \ NetworkInformation \ ping.cs .com/netframework.aspx) – Brian 2012-01-12 18:13:47

回答

1

很難確切知道在你的問題中的信息。有太多事情可能會出錯。但是,我會開始檢查一些內容。

  • ICMP數據包可能被錯誤地格式化。我將使用wireshark將自定義ping數據包的結果與已知功能實用程序的結果進行比較,以查看是否有任何差異
  • destinationIPremoteEndpoint值可能指向不同的地址。似乎不太可能,但想叫出來
  • 有問題的IP可能只是拒絕ping請求。我會驗證與另一個工具,它是返回ping
  • 防火牆可能會阻礙。我會暫時禁用它,然後重新運行我的程序以查看是否是原因。
+1

我會建議使用框架['Ping'](http://msdn.microsoft.com/en-us/library/system.net.networkinformation.ping.aspx)類實現驗證最後兩個要點。如果框架'Ping'有效,那麼這很可能是您的應用程序中的一個錯誤。如果框架'Ping'失敗,則很可能是配置問題。 – Brian 2012-01-12 18:18:11

0

您是否需要構建自己的數據包?還有就是平級的,否則

http://msdn.microsoft.com/en-us/library/system.net.networkinformation.ping.aspx

編輯:

Ping pingSender = new Ping(); 
PingReply reply = pingSender.Send ("www.contoso.com"); 

if (reply.Status == IPStatus.Success) 
{ 
    Console.WriteLine ("Address: {0}", reply.Address.ToString()); 
    Console.WriteLine ("RoundTrip time: {0}", reply.RoundtripTime); 
    Console.WriteLine ("Time to live: {0}", reply.Options.Ttl); 
    Console.WriteLine ("Don't fragment: {0}", reply.Options.DontFragment); 
    Console.WriteLine ("Buffer size: {0}", reply.Buffer.Length); 
} 
else 
{ 
    Console.WriteLine (reply.Status); 
} 
+1

該OP似乎是做這個學習練習。使用現有的類將打敗目的 – JaredPar 2012-01-12 16:07:38