2011-04-21 124 views
0

我有一个设备带来了信号捕获(vilistus)的问题,因为它的软件应该在捕获过程中将数据发送到tcp端口(#123),并且我使用了tcp的ac#代码监听器从同一端口接收数据,但程序在命令行的accepttcpclient()被阻止,并且没有收到数据。从tcp端口接收数据

TcpClient client = this.tcpListener.AcceptTcpClient(); 
+0

你确定你的设备发送数据?尝试使用Wireshark或其他网络分析工具来查看网络上发生了什么。 – Brandon 2011-04-21 21:29:19

回答

0

这听起来像一个客户端没有连接到监听器。当您在TcpListener上调用AcceptTcpClient时,应用程序将挂起,等待客户端连接,这似乎是您遇到的问题。

您可以通过执行BeginAcceptTcpClient来解决此问题,这将释放应用程序并允许程序在等待客户端时继续执行。当客户端连接,然后委托将被调用,然后就可以开始处理客户端,读取数据等,因此,例如:

class Comms 
{ 
    TcpListener listener; 
    TcpClient client; 

    // Starts listening for a tcp client 
    public void StartListener() 
    { 
     listener = new TcpListener(IPAddress.Any, 123); 
     listener.BeginAcceptTcpClient(new AsyncCallback(ClientCallback), listener); 
    } 

    // Callback for when a client connects on the port 
    void ClientCallback(IAsyncResult result) 
    { 
     listener = (TcpListener)result.AsyncState; 
     try 
     { 
      client = listener.EndAcceptTcpClient(result); 
      // From here you can access the stream etc and read data 
     } 
     catch (IOException e) 
     { 
      // Handle any exceptions here 
     } 
    } 
} 

提供了客户端连接正确,那么你将可以自由地访问客户的NetworkStream和然后读取和写入数据到客户端。下面是一个快速参考和示例,你可以看看: http://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener.beginaccepttcpclient.aspx

当涉及到数据的读取和写入时,您将遇到与客户端的NetworkStream读取和写入功能类似的锁定问题。对于这个问题有两种可能的解决方案:

  1. 设置超时的读写功能,通过设置的NetworkStream的ReadTimeout和WriteTimeout性能。

  2. 通过使用NetworkStream中的BeginRead和BeginWrite函数,使用与BeginAcceptTcpClient类似的回调方法。

个人而言,我更喜欢第二个选项为第一,直到发生超时不会释放程序,但他们都是可行的选择,它取决于你更愿意执行哪一个。你可以去这里了解更多有关的NetworkStream的更多信息: http://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.aspx

希望这有助于

0

这听起来很奇怪的是,该设备正在客户端。你确定你不应该使用tcpClient.Connect()到端口123上的设备吗?

为什么?

  1. 设备应该如何知道您的服务器正在运行?它不能尝试永远连接。
  2. 设备如何知道端口123对于您的PC中的应用程序是免费的?