2011-05-09 2 views
3

다른 컴퓨터에있는 MySql 데이터베이스에 대한 간단한 연결을 시도하고 있습니다. Windows의 데이터 소스에 telnet으로 연결할 수 있으며 OSX 및 Ubuntu의 터미널을 내 네트워크의 내부 및 외부 모두에서 사용할 수 있습니다. 그러나 OSX에서 모노 프로젝트를 통해 연결을 거부합니다.MySQL .NET 어댑터가 내가 시도한 것과 상관없이 Mono에서 연결을 거부합니다.

나는 나타납니다

지정된 MySQL의 임의의 호스트에 연결할 수 없습니다

... 내가 방화벽 규칙이 효과가없는 확인했다

-도 내 OSX 또는 우분투에 데이터베이스가 호스팅되는 시스템. 모노 프로젝트와 같은 머신에있는 MySQL 워크 벤치는 문제없이 연결할 수 있습니다.

나는 코드를 통해 데이터베이스에 연결하려고했습니다 :

서버 = MyIP에; 데이터베이스 = FK; 사용자 ID = george; 패스워드 = 패스; 포트 =

와 OSX에 모노에 사전 설치되어 플러그인을 통해 3306 :

Tools > Database > Add Database Connection > MySql database

내가 내 연결 문자열을 사용하지 않는 - 나는 그것을 만들 수는 자신의 데이터베이스 정보를 기반으로합니다. 그러나 차이는 없습니다. 연결을 테스트 할 때 - 프로그래밍 방식으로 연결하려고 시도 할 때받는 메시지와 동일한 메시지가 계속 표시됩니다.

mySQL 데이터베이스를 호스팅하는 서버에 연결 시도가 표시되지 않습니다.

5.2 모노 .NET 커넥터와 6.3 커넥터 (v2 및 v4 모두)를 모두 사용하려고했으나 연결에 실패했습니다.

GAC에 어셈블리를 배치하고 bin 디렉토리의 프로젝트에 로컬로 배치하려고했습니다. 차이는 없습니다.

나는 연결 프로토콜에서 소켓과 tcp뿐만 아니라 메모리와 파이프도 시도했다. 없음.

Mono에서 제외하고 다른 곳에서 작동하는 서버에 연결할 수없는 이유는 전혀 이해가되지 않습니다. 내 요청을 차단하는 방화벽이 실행되고 있지 않습니다.

Mono에서 연결하는 것이 어렵지 않아야합니다. 따라서 뭔가 분명히 이 잘못되었습니다. IDE가 데이터베이스에 연결할 수 없다는 것을 알 수 있습니다.

내 자격 증명은 문제가되지 않지만 절대적으로 정확합니다. 서버에 도달 할 수 없기 때문에 신원 정보가 정확합니다. 연결할 수 없다는 응답을 받기까지 약 10-15 초가 걸리므로 연결 시도 중이라고 가정합니다.

동일한 정확한 코드는 모노와 아파치를 통해 제공되는 우분투 서버 (별도의 컴퓨터 및 네트워크에있는 mySQL 서버)에 배포 할 때 잘 연결됩니다. XSP 문제일까요? 나는 모른다.

나는 이것을 얻으려고 많은 시간을 보냈으며, 모노로부터 mySQL에 연결하는 방법을 찾을 수있는 모든 튜토리얼과 웹 사이트를 살펴 보았다. 모든 사람은 마지막, 실패와 같은 방식으로 결론을 내 렸습니다. 어떤 도움이 필요합니까?

+0

Redhat/Fedora라면 SELinux 로그를 확인하십시오. 우분투에는 "AppArmor"가 있습니다 - 아마도 로그 또는 간섭을 일으킬 수있는 설정이 있습니까? – Charles

+1

@Charles 실제로 MySQL 어댑터 코드를 실행하여 문제를 발견했습니다. OSX가 내 OS 및 엔드 포인트 문제로 확인되지 않는 것과 관련이 있습니다. 나는 곧 나의 해결책을 게시 할 것이다. 감사 –

답변

3

다음은 내가 연결하도록 한 것입니다.

  1. MySql.Data 어댑터의 소스 코드를 다운로드하십시오.
  2. 은 (코드 주석에서 참조) StreamCreator.cs CreateSocketStream 방법을 교체

    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를 연결하기 위해 위에서 언급 한 것을 제외하고는 다른 방법을 찾지 못했습니다. 이러한 변경 없이는 작동하지 않습니다.

관련 문제