2014-06-17 101 views
0

我已经创建了一个使用TCP/IP套接字文件传输communication.Now我想添加一个功能,检查TCP/IP coonection就具体的远程服务器的应用程序端口号(无论是否可用于转移)。所以,请有任何人帮助我。提前感谢。如何使用C#(socket通信)来检查TCP/IP端口可用性

如果(string.IsNullOrEmpty(txtIP.Text)) 回报;

如果(string.IsNullOrEmpty( “8001”)) 回报;

   int port; 
       hostAddress = Dns.GetHostEntry(txtIP.Text).AddressList[0]; 
       int.TryParse("8001", out port); 
       StateObject state = new StateObject(); 
       if (hostAddress.AddressFamily == AddressFamily.InterNetwork) 
        state.workSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
       else if (hostAddress.AddressFamily == AddressFamily.InterNetworkV6) 
        state.workSocket = new Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp); 

       SocketAsyncEventArgs telnetSocketAsyncEventArgs = new SocketAsyncEventArgs(); 
       telnetSocketAsyncEventArgs.RemoteEndPoint = new IPEndPoint(hostAddress, port); 
       telnetSocketAsyncEventArgs.Completed += new 
        EventHandler<SocketAsyncEventArgs>(telnetSocketAsyncEventArgs_Completed); 

       state.workSocket.ConnectAsync(telnetSocketAsyncEventArgs) 

私人无效telnetSocketAsyncEventArgs_Completed(对象发件人,的SocketAsyncEventArgs E) { 尝试 { 如果(e.SocketError == SocketError.Success) { 如果(e.LastOperation == SocketAsyncOperation.Connect) { MessageBox.Show( “服务正在运行”,hostAddress.ToString(), MessageBoxButtons.OK,MessageBoxIcon.Information);

     ////send file if connection is established. 
        Socket clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
        byte[] fileName = Encoding.UTF8.GetBytes(m_fName); //file name 
        byte[] fileData = File.ReadAllBytes(txtFilePath.Text); //file 
        byte[] fileNameLen = BitConverter.GetBytes(fileName.Length); //lenght of file name 
        m_clientData = new byte[fileNameLen.Length + fileName.Length + fileData.Length]; 

        fileNameLen.CopyTo(m_clientData, 0); 
        fileName.CopyTo(m_clientData, fileNameLen.Length); 
        fileData.CopyTo(m_clientData, fileNameLen.Length + fileName.Length); 

        //Code for Progress bar 
        lblmsg.Text = ""; 
        double divider; 
        int extra; 
        fileProgress.Value = 0; 
        divider = (double)m_clientData.Length/1024; 
        divider = Math.Ceiling(divider); 
        fileProgress.Maximum = m_clientData.Length; 
        int packet = 0; 
        for (int i = 0; i < divider; i++) 
        { 
         if (i == (divider - 1)) 
         { 
          extra = (m_clientData.Length) - (i * 1024); 
          clientSock.Send(m_clientData, packet, extra, SocketFlags.None); 
         } 
         else 
         { 
          clientSock.Send(m_clientData, packet, 1024, SocketFlags.None); 
          packet = packet + 1024; 
          fileProgress.Value += 1024; 
         } 
        } 
        clientSock.Close(); 
        fileProgress.Value = fileProgress.Maximum; 
        lblSender.Text = "File upload is completed."; 
        clientSocket.Disconnect(true); 
        // } 

       } 
      } 
      else 
      { 
       bPortAvailble = false; 
       MessageBox.Show("Service Is not Running", e.SocketError.ToString(), 
        MessageBoxButtons.OK, MessageBoxIcon.Error); 
      } 
     } 
     catch (SocketException ex) 
     { 
      MessageBox.Show(ex.Message, "Service Is not Running", 
       MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 
    } 


} 
+0

要知道您是否能够成功完成转移,唯一的方法就是实际尝试转移。其他任何事情都会受到竞争条件的影响,例如网络可能发生变化,服务器可能失败等等。 –

回答

0

您可以尝试使用TcpClient建立连接,并捕获异常: TcpClient

在你的情况,你正在使用Socket类的地方,看看这里: Socket class。如果你不Connect第一Send方法应该是失败的,从这里引用:

如果您使用的是无连接的协议,则必须调用此方法之前调用Connect,或发送会引发SocketException。

所以首先使用Connect,并捕捉它是否抛出SocketExcpetion

+0

这是编程的好方法吗? – user3748116

+0

这正是你所问:-)虽然,如果你想提供更多关于文件传输启动如何工作的信息,我们可以将它们结合起来。 – kobigurk

+0

嗨kobigurk,我已附加文件传输的代码是在发送按钮单击。在此我想在发送前检查可用性。 – user3748116