2011-03-24 201 views
1

我在Firebird和.net的幾個客戶端網站上遇到了一個奇怪的問題。我正在使用firebird 2.1和用於visual studio的DDEX Provider,並且正在使用c#。 Specificaly我得到一個非常普遍的例外情況如下:似乎無法讓Firebird連接到本地IP地址

Exception on trying to connect to firebird DB: 
FirebirdSql.Data.FirebirdClient.FbException: Unable to complete network request to host "10.206.34.177". 
---> FirebirdSql.Data.Common.IscException: Exception of type 'FirebirdSql.Data.Common.IscException' was thrown. 
at FirebirdSql.Data.Client.Gds.GdsConnection.Connect(String dataSource, Int32 port, Int32 packetSize, Charset charset) 
at FirebirdSql.Data.Client.Gds.GdsDatabase.Attach(DatabaseParameterBuffer dpb, String dataSource, Int32 port, String database) 
at FirebirdSql.Data.FirebirdClient.FbConnectionInternal.Connect() 
--- End of inner exception stack trace --- 
at FirebirdSql.Data.FirebirdClient.FbConnectionInternal.Connect() 
at FirebirdSql.Data.FirebirdClient.FbConnectionPool.Create() 
at FirebirdSql.Data.FirebirdClient.FbConnectionPool.CheckOut() 
at FirebirdSql.Data.FirebirdClient.FbConnection.Open() 
at Seljax.Database.Firebird.DatabaseManager.TryToConnect() 

這似乎給我說明網絡問題,可能是一個防火牆或者諸如此類代替財產以後?但我似乎無法找到該塊?

的更多信息(2個不同的情況下):

情況1(網絡1):


視窗7 X64的計算機,運行的服務包1.我已經配置火鳥使用的5013端口,如果我指定本地環回地址(127.0.0.1),它就可以很好地連接。此外,它僅連接本地IP地址(10.206.34.177),當前配置爲satic,網絡掩碼爲255.255.255.192。但是,如果我更改此計算機使用動態IP地址(從DHCP服務器獲取),並嘗試連接到IP(在這種情況下,我得到10.206.34.184掩碼255.255.255.192)我得到上述異常。盡我所知,除了使用靜態IP外,我已將所有配置與DHCP服務器提供的相同。除此之外,我嘗試了以下操作使其可以與動態IP地址配合使用: - 關閉了Windows防火牆 - 關閉了微軟安全實用程序(實時防護) - 關閉了防火牆和MSE - 確保用戶帳戶控制設置爲最低 - 從網絡配置中禁用IPV6

盡我所知,網絡設置爲不過濾任何類型的內部網絡流量。我可以很好地ping通本地系統。我有一個簡單的程序,它使用c#的TcpClient類打開系統的套接字,它連接到ip和端口,我認爲這意味着建立了一個套接字連接,這似乎表明它可以工作。

請注意,我看起來最好,我無法找到任何其他防病毒或防火牆安裝在微軟安全essensial以外,內置防火牆。

Totaly茫然,建議請?

案例2(網絡2):


的Windows 7 X32電腦,沒有SP1。我已經將firebird端口配置爲3050.我甚至無法使用環回地址(127.0.0.1)連接到此機器。我試過靜態,非靜態,禁用IPV6,禁用防火牆和禁用MSE。本機的IP:10.200.81.179掩碼255.255.255.192。

更新 - 這臺機器現在可以連接到自身,改變網絡使用靜態IP地址在所有三個machiens後,但低於

介紹,一個新的問題重新列,完全以在對意見,建議虧損請?

更多信息: 我已經安裝了一個瘋狂的簡單測試程序,它有3個文本框,我可以填充連接到數據庫,並且我已經確認它可以像Firebird一樣運行,並且與沒有運行,它會產生我在clinet機器上發生的完全相同的錯誤。

因此,例如,您啓動firebird服務,運行connect,success,關閉服務,運行connect和上面的異常,並且FbException中的所有其他異常都將與我的機器試圖連接到。

我把所有的代碼設置上點擊一個按鈕,無論如何,以供參考,這將導致異常的代碼是在這裏:

 // setup connection 
     FbConnectionStringBuilder csb = new FbConnectionStringBuilder(); 
     csb.DataSource = firebirdAddress.Text; 
     csb.Port = Convert.ToInt32(firebirdPort.Text); 
     csb.Database = firebirdPath.Text; 
     csb.ServerType = 0; 
     csb.UserID = "SYSDBA"; 
     csb.Password = "masterkey"; 
     csb.Dialect = 3; 

     // generate the conneciton object 
     string connectionString = csb.ToString(); 
     FbConnection connection = new FbConnection(connectionString); 

     try 
     { 
      MessageBox.Show("Trying to connect with string: " + Environment.NewLine + connectionString); 
      connection.Open(); 
      MessageBox.Show("Firebird connected successfully!"); 
     } 
     catch (Exception exception) 
     { 
      FbException fireException = (FbException) exception; 

      for (int i = 0; i < fireException.Errors.Count; i++) 
      { 
       MessageBox.Show("Class: " + fireException.Errors[i].Class.ToString() + Environment.NewLine + 
        "Error #" + fireException.Errors[i].Number.ToString() + ": " + fireException.Errors[i].Message + " on line " + 
        fireException.Errors[i].LineNumber.ToString()); 
      } 


      MessageBox.Show("Exception caught: " + Environment.NewLine + exception.ToString()); 

      // loop through all inner exceptions 
      while (exception.InnerException != null) 
      { 
       MessageBox.Show("Inner exception: " + Environment.NewLine + exception.InnerException.ToString()); 
       exception = exception.InnerException; 
      } 

     } 
     finally 
     { 
      connection.Close(); 
      connection = null; 
      connectionString = null; 
      csb = null; 
     } 

不管怎樣,任何建議或信息將非常appricated!


一些更多的信息,已經到了光,如果上述1我能夠成功連接到使用Windows XP的機器及以上的爲入門連接顯示的代碼的計算機。

是Windows做一些奇怪的IP路由?


更新: 的情況下,2的計算機不能夠連接到127個地址通過改變所有的機器在網絡上使用靜態IP地址已被「固定」。然而情況2變得更有趣。 Senario有三臺電腦。三者可以「排序」,因爲它們都設置爲靜態IP。

Details of communication: 
Computer A  Computer B Computer C 
works   works   doesn't work   Computer A 
works   works   doesn't work   Computer B 
doesn't work works   works     Computer C 

顯而易見的答案將是把在計算機B上的服務器,並用它去,但它好好嘗試一下logisticaly工作,因爲該計算機是一個非常貧窮的機器,並且很少上。請注意,所有三個運行的是Windows 7


分辨率: 以上,其中一些電腦不能跟他人和有參與了3臺機器的情況下2,原來是有2臺電腦使用相同網絡上的名稱。我最好的猜測是windows或firebird,或者兩者都以某種方式依賴於通信的名稱,而重複的名稱則阻止了它。

在案例1中,我們的解決方案僅僅是將機器保持爲靜態IP地址。不知道爲什麼這是乾淨的,但它確實解決了這個問題。此外,此網絡上還有第二臺機器,它也是Windows 7,如果沒有靜態IP地址,將無法正確連接。

+0

你可以從isql連接嗎? – jachguate 2011-03-24 19:16:28

+0

是的,它似乎在機器上非常安全,ISQL工作正常。 – Beau 2011-03-24 19:30:27

+0

其實,這是一個很好的觀點,ISQL不會像.net dll那樣以幾乎相同的方式進行連接?還是它做了一些完全不同的事情? – Beau 2011-03-24 19:31:27

回答

1

好的,所以在案例2中,問題原來是有兩臺計算機在網絡上同名!

我現在有點渾身解體,問題很簡單,而且這種奇怪的症狀正在產生。

我不確定這是怎麼或爲什麼,但它現在已經修復。我將檢查Case 1明天。

對於在兩個獨立網絡中的情況1和情況2。

+0

案例1,通過將其設置爲DHCP時無法連接到網絡地址,只需將其保留爲靜態IP即可解決。 – Beau 2011-03-25 16:58:16

+0

當然你可以連接到DHCP分配的IP地址,你可以連接到正確配置的網絡中的機器名,比如'SomeMachine:/ path/to/db.fdb' – jachguate 2011-03-25 17:40:26

+0

哦,謝謝!這可能是另一種方式(通過機器名稱連接) – Beau 2011-03-28 18:10:58

2

,張貼在您的評論的信息,我認爲你的問題可能是其中之一:

  • 本地Windows防火牆或其他防火牆軟件(防病毒,例如)阻止了連接。您通常必須手動添加規則或例外以允許將流量輸入到Firebird正在偵聽的端口。
  • 火鳥就是不聽那個特定接口(不太可能,如果你沒有更改配置)上,請檢查您firebird.conf文件的RemoteBindAddress

#允許傳入的連接是綁定到特定網卡的IP地址
#。它可以通過除此之外的任何其他網絡接口來拒絕傳入連接
#。默認情況下,允許來自任何可用網絡接口的
#連接。
#如果您使用的是Classic Server,則此設置僅適用於Windows。
#在Linux,BSD或Mac OS X,與經典服務器使用xinetd或的launchd
#配置文件(綁定參數)

#類型:字符串

RemoteBindAddress = 127.0.0.1

您可以使用netstat -a命令檢查Firebird是否在端口上偵聽。

此輸出火鳥是偵聽所有接口:

TCP 0.0.0.0:3050   jacastillo:0   LISTENING 

,而這是當它監聽一個專門在127.0.0.1

TCP 127.0.0.1:3050   jacastillo:0   LISTENING 

3050是默認的端口,檢查權你正在聽的端口

+0

您可能沒有關注jachguate和我的對話,但我們已經將計算機切換到一個站點上的靜態IP,現在我們可以連接到127.0.0.1,但是連接到其他計算機時,它無法工作。我嘗試將綁定地址設置爲靜態IP,並嘗試從另一臺機器連接到它,但未成功。我現在只是獲取netstat數據,稍後我會發布。 – Beau 2011-03-24 20:57:15

+0

@Beau我跟隨,因爲我jachguate ...:D – jachguate 2011-03-24 21:02:12

+0

哦..這是愚蠢的。抱歉。 – Beau 2011-03-24 21:04:46