我有一个设备带来了信号捕获(vilistus)的问题,因为它的软件应该在捕获过程中将数据发送到tcp端口(#123),并且我使用了tcp的ac#代码监听器从同一端口接收数据,但程序在命令行的accepttcpclient()
被阻止,并且没有收到数据。从tcp端口接收数据
TcpClient client = this.tcpListener.AcceptTcpClient();
我有一个设备带来了信号捕获(vilistus)的问题,因为它的软件应该在捕获过程中将数据发送到tcp端口(#123),并且我使用了tcp的ac#代码监听器从同一端口接收数据,但程序在命令行的accepttcpclient()
被阻止,并且没有收到数据。从tcp端口接收数据
TcpClient client = this.tcpListener.AcceptTcpClient();
这听起来像一个客户端没有连接到监听器。当您在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读取和写入功能类似的锁定问题。对于这个问题有两种可能的解决方案:
设置超时的读写功能,通过设置的NetworkStream的ReadTimeout和WriteTimeout性能。
通过使用NetworkStream中的BeginRead和BeginWrite函数,使用与BeginAcceptTcpClient类似的回调方法。
个人而言,我更喜欢第二个选项为第一,直到发生超时不会释放程序,但他们都是可行的选择,它取决于你更愿意执行哪一个。你可以去这里了解更多有关的NetworkStream的更多信息: http://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.aspx
希望这有助于
这听起来很奇怪的是,该设备正在客户端。你确定你不应该使用tcpClient.Connect()
到端口123上的设备吗?
为什么?
你确定你的设备发送数据?尝试使用Wireshark或其他网络分析工具来查看网络上发生了什么。 – Brandon 2011-04-21 21:29:19