2017-04-20 6 views
0


私のプログラムのソケットに問題があります。私は別のプログラムにFTPサーバーembedeedを開発しており、そのためにソケットとTCPListenerを作成しました。この場合、私の問題が発生します。
- 誰も接続せずに閉じると、初めて接続を開きます。そうしないと、誰かが私のFTPサーバーに接続していれば、すべて正常に動作します。
- 初めて接続を終了して誰も接続せずにもう一度開くと、 "socket/ip address/port"というSocketExceptionが既に使用されていて、もう一度インスタンス化できません。Compact Framework 2.0での受信タイムアウト

public void Start() 
    { 
     ServerStarted = true; 

     if (this.authHandler == null) 
      this.authHandler = new DefaultAuthHandler(); 

     if (this.fsHandler == null) 
      this.fsHandler = new DefaultFileSystemHandler(); 

     Socket socketServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

     TcpListener listenerServer = new TcpListener(endpoint); 
     listenerServer.Start(); // The exception is here at the second time 
           // I open the connection without anybody connected before 

     try 
     { 
      while (ServerStarted) 
      { 
       socketServer = listenerServer.AcceptSocket(); 

       try 
       { 
        IPEndPoint socketPort = (IPEndPoint)socketServer.RemoteEndPoint; 
        Session session = new Session(socketServer, bufferSize, this.authHandler.Clone(socketPort), this.fsHandler.Clone(socketPort)); 

        session.Start(); 
        sessions.Add(session); 

        p_HostIPAddress = socketPort.Address; 

        if (p_HostIPAddress != null) 
         HostConnected = true; 

        // Purge old sessions 
        for (int i = sessions.Count - 1; i >= 0; --i) 
        { 
         if (!sessions[i].IsOpen) 
         { 
          sessions.RemoveAt(i); 
          --i; 
         } 
        } 
       } 
       catch(Exception ex) 
       { 
       } 
      } 
     } 
     catch (SocketException socketEx) 
     { 
     } 
     finally 
     { 
      foreach (Session s in sessions) 
      { 
       s.Stop(); 
       HostConnected = false; 
      } 
      TcpSocketListener = null; 
     } 
    } 

私はコンパクトな枠組みの中でのタイムアウトの呼び出しがないことを知っているので、私は、バックグラウンドでの私のソケットがまだ開いていることを避けるために何を行うことができます:
私の関数のコードは、ということです。 OHW、右、別の余分な情報:
実際OpenNETCF FTPライブラリを使用して、私のftpサーバ

答えて

0

[OK]を、私はSetSocketOptionを使用して解決してきたと私は少しにコードを変更しました。ここが今です:

public void Start() 
    { 
     ServerStarted = true; 

     if (this.authHandler == null) 
      this.authHandler = new DefaultAuthHandler(); 

     if (this.fsHandler == null) 
      this.fsHandler = new DefaultFileSystemHandler(); 

     socketServer = new Socket(AddressFamily.InterNetwork, 
            SocketType.Stream, 
            ProtocolType.Tcp); 

     /* Here is the change. In this way I can reuse multiple times the 
     * same address without getting the SocketException.*/ 
     socketServer.SetSocketOption(SocketOptionLevel.Socket, 
            SocketOptionName.ReuseAddress, 
            1); 

     Socket handler = null; 

     try 
     { 
      socketServer.Bind(endpoint); 
      socketServer.Listen(10); 

      while (ServerStarted) 
      { 
       handler = socketServer.Accept(); 

       try 
       { 
        IPEndPoint socketPort = (IPEndPoint)handler.RemoteEndPoint; 
        Session session = new Session(handler,bufferSize, 
             this.authHandler.Clone(socketPort), 
             this.fsHandler.Clone(socketPort)); 

        session.Start(); 
        sessions.Add(session); 

        p_HostIPAddress = socketPort.Address; 

        if (p_HostIPAddress != null) 
         HostConnected = true; 

        // Purge old sessions 
        for (int i = sessions.Count - 1; i >= 0; --i) 
        { 
         if (!sessions[i].IsOpen) 
         { 
          sessions.RemoveAt(i); 
          --i; 
         } 
        } 
       } 
       catch(Exception ex) 
       { 
       } 
      } 
     } 
     catch (SocketException socketEx) 
     { 
     } 
     finally 
     { 
      handler.Close(); 

      foreach (Session s in sessions) 
      { 
       s.Stop(); 
       HostConnected = false; 
      } 
     } 
    } 
関連する問題