从tcp端口接收数据

时间:2011-04-21 21:19:32

标签: c#

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

TcpClient client = this.tcpListener.AcceptTcpClient();

2 个答案:

答案 0 :(得分: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类似的回调方法。

  3. 就我个人而言,我更喜欢第二个选项,因为第一个选项在超时发生之前不会释放程序,但它们都是可行的选项,它取决于您希望实现的选项。您可以访问此处以获取有关NetworkStream的更多信息: http://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.aspx

    希望这有帮助

答案 1 :(得分:0)

设备是客户端听起来很奇怪。您确定不应在端口123上使用tcpClient.Connect()设备吗?

为什么?

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