2010-08-06 48 views
1

)。我今天用TcpListener進入了一些問題。事情很奇怪。最初,我使用了新的TcpListener(port)構造函數,但它已被標記爲過時。所以我放棄了它,並用這個來代替:IPAddress.Any Fail

IPAddress ipAddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0]; 
    IPEndPoint ipLocalEndPoint = new IPEndPoint(ipAddress, ServerPort); 
    TcpListener tcpServer = new TcpListener(ipLocalEndPoint); 

    _TCPClient = tcpServer.AcceptTcpClient(); 
    GotClient(); 

我這樣做,在一個線程,當然,這樣纔不會鎖定應用程序。現在,發生的情況是,即使ipAddress正確,服務器也不會接受任何傳入連接。

但是,更改爲新的IPEndPoint(IPAddress.Any,ServerPort)似乎有伎倆!這在2種方式中很愚蠢:

  1. 2小時前,IPAddress.Any返回192.168.1.102這是我的正確本地IP。這是相同的IP地址 IPAddress!但是使用ipAddress它不起作用,而使用IPAddress.Any它工作(也就是說,它成功地接受了來自我的客戶端的連接)。

  2. 當前:IPAddress.Any返回0.0.0.0(!?),而ipAddress變量繼續分配給我正確的IP(192.168.1.102)。結果?如果使用ipAddres,我的客戶端不能連接,但當使用IPAddress.Any時,連接,即使它是0.0.0.0。

我完全被這個困惑......任何想法?

我目前在Form_HandleCreated中有這個,但當我在Form的構造函數中使用它時,它的行爲也很奇怪。

後來編輯:我想我錯了IPAddress.Any返回192.168.1.102。我可能會印出其他的東西,因爲你們許多人都表示0.0.0.0是什麼。任何應該返回。對不起:: - D.

回答

7

IPAddress.Any應該返回0.0.0.0,這是正常的。你真的確定它最初返回了其他東西嗎?

至於爲什麼你以前不能連接,如果你正在監聽192.168.1.102,並試圖連接到127.0.0.1(localhost),那麼它將無法工作。如果要連接到該IP地址,則需要在127.0.0.1上進行監聽。

本質上,您必須監聽您嘗試連接的IP地址。聽取0.0.0.0意味着「偵聽所有可用的IP地址」。請記住,127.0.0.1(本地主機)不是「我的本地網絡IP」的同義詞。

+0

嗨,感謝您的回答:: - D.是的,我想我犯了一個錯誤。任何和打印在控制檯ipAddress代替。 無論如何,我試圖從Device Emulator(從.Net CF應用程序)連接到192.168.1.102。所以我沒有嘗試127.0.0.1。儘管......想到了這個想法......如果模擬器本身能夠通過它呢?雖然在.Net Compact Framework的套接字中我特別要求192.168.1.102。 – Axonn 2010-08-06 16:51:33

+1

如果你試圖從模擬器連接到主機,我不知道IP地址是什麼樣的......可能有一些NAT,我不能說。 – Mark 2010-08-06 16:55:06

+1

另外,它讓我想知道是否已經在仿真器和主機之間建立了網絡連接。我似乎記得模擬器中有多種選項用於網絡工作。另外,請確認您的防火牆設置,它可能會被阻止,具體取決於您設置的方式。 – Mark 2010-08-06 16:56:56

1
+0

我可能犯了一個錯誤。也許向控制檯打印一些其他變量(如ipAddress)。對不起,如果我這樣做。 – Axonn 2010-08-06 16:49:08

+0

@Axonn:我不認爲這是你必須在這裏認識的東西。我相信我們已經完成了至少一次:-) – Kendrick 2010-08-06 18:02:42

+0

我後來編輯它:: - )。但是這個網站太快了*笑*。永遠不會令我驚歎。真的很棒的社區,我們到了這裏。我不回答問題,但我盡我所能回饋社區:免費軟件和網站上的文章:: - )。 – Axonn 2010-08-06 18:11:09

4

0.0.0.0是空白的IP地址,意思是「我不在乎哪個IP你可以使用」 - 也就是說,它意味着你要聽的所有接口。它被記錄應該返回它。

以後編輯:首先不要撥打[0]。您的主機名可能沒有任何關聯記錄。即使它你a)不知道命令b)你不知道它們在哪裏(即它可能只有127.0.0.1即回送)。

單聲道這樣的代碼工作(用netstat等檢查)):

using System; 
using System.Net; 
using System.Net.Sockets; 

public class test { 
    public static void Main(String[] args) { 
     IPAddress ipAddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0]; 
     IPEndPoint ipLocalEndPoint = new IPEndPoint(ipAddress, 8888); 
     TcpListener tcpServer = new TcpListener(ipLocalEndPoint); 
     tcpServer.Start(); // Without this line there is exception 
     var _TCPClient = tcpServer.AcceptTcpClient(); 
    } 
} 
+0

嗨,謝謝回答:: - )。所以這就是爲什麼這些作品...我明白了。嗯,問題依然存在......如何讓它在.1.102上工作。我不想聽所有的接口。 – Axonn 2010-08-06 16:52:19

+1

我回復了「稍後編輯」。可能作爲我的作品,但至少有一些答案。 – 2010-08-06 17:05:38

+0

謝謝Maciej :: - )。它可能與仿真器有關 - 我通過它連接,而不是通過物理設備。但是,在模擬器中,我試圖連接到192.168.1.102,所以我不明白爲什麼它實際上沒有這樣做。正如Mark所建議的那樣,可能是一些NAT的東西。我試着看看哪些端口正在使用,但Wireshark似乎沒有工作出於某種原因。 我剛把我的應用程序移動到我的HTC Tytn2,現在它可以工作。那個連接到192.168.1.102所以這可能是答案:模擬器通過其他地址。 – Axonn 2010-08-06 17:40:20

相關問題