2012-07-31 134 views
2

我正在維護使用TcpListener偵聽傳入通信的應用程序。下面的代碼打開的連接:TcpListener主動拒絕連接

Dim listener As TcpListener 
_listenFailed = False 
Try 
    listener = New TcpListener(System.Net.IPAddress.Parse(Me.Host), Me.Port) 
    listener.Start() 
Catch ex As Exception 
    ' an error here means the settings are likely bogus 
    _listenFailed = True 
    Return 
End Try 

While Not _stoplistening 
{ 
    ' Accept connection 
} 

,我有是,當我從不同的計算機發送一個文件,我得到錯誤「無連接可以作出,因爲目標機器積極地拒絕它的問題。 「

我檢查了防火牆和防病毒軟件,並且沒有任何塊。我用

netstat -a -n 

確定端口處於活動狀態並正在偵聽。這兩個應用程序都以管理員模式從Visual Studios運行,而不是這應該有所作爲。我有一個斷點設置在接受連接代碼的第一行,但它永遠不會運行。

我停止了應用程序並檢查了TcpListener,發現如果深入挖掘,會發生一些錯誤。在TcpListener.LocalEndpoint.IPEndPoint.IPAddress.Address.ErrorCode,出現錯誤10045「OperationNotSupported」。另外,在TcpListener.Socket.RemoteEndPoint.ErrorCode中,有一個錯誤1057,「發送或接收數據的請求被拒絕,因爲套接字未連接,並且(當使用sendto調用在數據報套接字上發送時)沒有提供地址。我不知道這些錯誤是否有關

如果任何人有任何關於什麼可能會導致此問題的見解,或可以採取的步驟來追蹤問題的根源,我將不勝感激。

+1

Me.Host的價值是什麼? – nunespascal 2012-07-31 17:51:05

+0

是Me.Host一個IP地址,一個回送或工作站名稱? – 2012-07-31 17:54:41

+0

我已確認它是計算機的IPv6地址。不幸的是,公司政策禁止我發佈實際的知識產權。抱歉。 – Tim 2012-07-31 17:57:13

回答

1

嘗試修改此:

listener = New TcpListener(System.Net.IPAddress.Parse(Me.Host), Me.Port) 

要這樣:

listener = New TcpListener(System.Net.IPAddress.Any, Me.Port) 

這將允許您監聽所有網絡接口。


此外,如果您要針對IPv6的,而不是你可以使用IPv6Any而不是Any。這種選擇顯然會對客戶端使用的地址產生影響。

+0

我不知道爲什麼解決它,但它確實。我之前有正確的IP地址匹配。感謝您的幫助! – Tim 2012-08-01 15:47:34

+0

@Tim從命令行執行'ipconfig',您將看到服務器公開的所有不同網絡接口。你通常需要聽所有這些。如果你指定一個獨特的IP地址,你只能限制自己。 – tcarvin 2012-08-01 16:16:10