3

別のマシンにあるMySqlデータベースに簡単に接続しようとしています。Windowsのデータソースにtelnetで接続し、OSXとUbuntuの端末を使用してネットワークの内部と外部の両方にアクセスできます。ただし、OSX上の私のmonoプロジェクトを介して接続することを拒否します。

私は受け取ります:

指定されたMySQLホストのいずれにも接続できません...

データベースがホストされているOSXマシンでもUbuntuマシンでも、ファイアウォールルールが有効になっていないことを確認しました。monoプロジェクトと同じマシン上にあるMySQLワークベンチは、問題なく接続できます。

コードを介してデータベースに接続しようとしました:

Server = myIp; データベース=FK; ユーザーID=george; Password = pass; ポート=3306

OSXのMonoにプリインストールされているプラ​​グインを介して:

Tools > Database > Add Database Connection > MySql database

接続文字列は使用しません。データベース情報に基づいて独自の接続文字列を作成します。ただし、違いはありません。接続をテストすると、プログラムで接続しようとしたときに表示されるのと同じメッセージで失敗します。

mySQLデータベースをホストしているサーバーは、接続の試行を示していません。

5.2モノラル.NETコネクタと6.3コネクタ(v2とv4の両方)の両方を使用しようとしました。どちらも接続に失敗します。

アセンブリをGACに配置し、プロジェクトのbinディレクトリにローカルに配置してみました。違いはありません。

接続プロトコルで、ソケットとtcpの両方、およびメモリとパイプを試しました。動作しません。

サーバーに接続できない理由はまったく意味がありません。サーバーは、Mono内以外のすべての場所で機能します。リクエストをブロックするファイアウォールは実行されていません。

Monoから接続するのはそれほど難しいことではないはずなので、どこかで明らかに何かが非常に間違っています。IDEがデータベースに接続することさえできないのを見てください。

サーバーにアクセスすることすらできないので、それは問題ではありませんが、私の資格情報は絶対に正しいです。接続できなかったという応答を受信するのに約10〜15秒かかるため、接続を試みていると思います。

モノラルとアパッチを介してサービスを提供しているUbuntuサーバー(mySQLサーバーとは別のマシンとネットワークに配置されている)にデプロイすると、まったく同じコードが正常に接続されますXSPの問題でしょうか?何も思いつきません。

私はこれを機能させるために数え切れないほどの時間を費やし、monoからmySQLへの接続について見つけることができるすべてのチュートリアルとWebサイトを調べました。誰もが最後の失敗と同じように結論を下しました。何か助けはありますか?

4

1 に答える 1

3

これが私がそれを接続するためにしたことです。

  1. MySql.Dataアダプターのソースコードをダウンロードします。
  2. CreateSocketStreamのメソッドを置き換えますStreamCreator.cs (コードコメントを参照)

     private Stream CreateSocketStream(IPAddress ip, bool unix)
        {
            EndPoint endPoint;
    
            // You don't need the following lines.
            //if (!Platform.IsWindows() && unix)
            //  endPoint = CreateUnixEndPoint(hostList);
            //else
    
            // Instead create a regular IPEndPoint.
            endPoint = new IPEndPoint(ip, (int)port);
            // Replace the socket it is trying to use with the following.
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            if (keepalive > 0)
            {
                SetKeepAlive(socket, keepalive);
            }
             // Remove the async.  connection.  This hangs and fails.  Not sure why.
            //IAsyncResult ias = socket.BeginConnect(endPoint, null, null);
            //if (!ias.AsyncWaitHandle.WaitOne((int)timeOut * 1000, false))
            //{
            //  socket.Close();
            //  return null;
            //}
            try {
                // Instead do a regular blocking connect to the endpoint.
                socket.Connect(endPoint);
            } catch (Exception ex) {
                throw;
            }
    
            // No longer relevant.
            //try
            //{
            //  socket.EndConnect(ias);
            //}
            //catch (Exception)
            //{
            //  socket.Close();
            //    throw;
            //}
            MyNetworkStream stream = new MyNetworkStream(socket, true);
            GC.SuppressFinalize(socket);
            GC.SuppressFinalize(stream);
            return stream;
        }
    

明らかに、これは醜くてハックです。ただし、OSX + Monoを接続するために上記でコメントした方法を除いて、他の方法は見つかりませんでした。これらの変更がないと機能しません。

于 2011-05-20T14:34:09.163 に答える