2017-04-20 64 views
0


我在我的程序中遇到了套接字問題。我正在開發一個嵌入到另一個程序中的FTP服務器,並且爲此我創建了一個套接字和一個TCPListener。我的問題發生在這種情況下:
- 我第一次打開連接,如果沒有人連接,我關閉它,一切正常;否則如果有人連接到我的FTP服務器都可以正常工作;
- 如果在第一次關閉連接並再次打開之前沒有任何人連接之前,我得到一個SocketException「socket/ip address/port」已被使用,我不能再次實例化它。
我的函數的代碼是: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,右,另一個額外的信息:
我的FTP服務器實際使用OpenNETCF FTP庫

回答

0

好吧,我使用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; 
      } 
     } 
    }