Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么在我读取TcpListener配置的套接字时没有收到数据?_C#_Sockets_Tcplistener - Fatal编程技术网

C# 为什么在我读取TcpListener配置的套接字时没有收到数据?

C# 为什么在我读取TcpListener配置的套接字时没有收到数据?,c#,sockets,tcplistener,C#,Sockets,Tcplistener,我能够使用TcpListener在套接字上建立连接,但我无法读取任何数据。我从未通过以下C代码中的DataAvailable检查(注意,这是一个摘要): 在客户端知道它可以发送数据之前,是否需要将某些内容发送回套接字?这里发生的情况是,您正在创建一个TcpListener(即底层套接字),接受连接并立即检查数据。很可能客户机尚未发送任何内容,而您没有阅读任何内容就离开了外部if子句。取决于你想做什么,你可能会尝试类似的事情 if(m_client.Connected) { Networ

我能够使用TcpListener在套接字上建立连接,但我无法读取任何数据。我从未通过以下C代码中的DataAvailable检查(注意,这是一个摘要):


在客户端知道它可以发送数据之前,是否需要将某些内容发送回套接字?

这里发生的情况是,您正在创建一个TcpListener(即底层套接字),接受连接并立即检查数据。很可能客户机尚未发送任何内容,而您没有阅读任何内容就离开了外部if子句。取决于你想做什么,你可能会尝试类似的事情

if(m_client.Connected) 
{
    NetworkStream clientStream = m_client.GetStream();
    while(!m_client.DataAvailable) //be careful here - maybe introduce a timeout
    {}
    byte[] message = new byte[14];
    int bytesRead = clientStream.Read(message, 0, 14);
}

无论如何,我不知道你到底想做什么,我不能再帮你了。代码可能会工作,但我建议重新设计,因为从您的代码片段中可以看出,您的代码存在错误的设计选择(尽管这可能来自您的摘要)。

您的主机是环回端口。您正在尝试连接到自己吗?如果您不向套接字发送任何内容,则不会收到任何内容。您正在检查套接字连接后是否立即有任何可用数据。很可能还没有任何可用的数据,但这只是由于时间原因。通常,您要么使用异步IO,要么为每个连接使用单独的线程,并进行阻塞读取。也不要假设整个消息可以一次读取。@JonSkeet这可能就是答案,还有一点额外的好处。我正在测试的客户端程序与我的服务器代码运行在同一台主机上。客户端程序在连接建立后立即发送数据,但我没有收到数据。是的,我显示的摘要代码只是一个摘要。代码是在更好的线程结构中设计的。我尝试过休眠等待数据。另外,客户端代码实际上是一个VB6应用程序,但只要套接字作为TCP套接字处理,这就不重要了。我相信客户端连接到一个AF_INET套接字。C#sharp侧的套接字使用了一个InterNetwork的addressFamily。我不知道这是否会引起冲突。我想我发现了我的问题。我了解到,我试图从中接收数据的客户端程序需要首先向其发送一条ping类型的消息,这只是用于此项目的协议。
if(m_client.Connected) 
{
    NetworkStream clientStream = m_client.GetStream();
    while(!m_client.DataAvailable) //be careful here - maybe introduce a timeout
    {}
    byte[] message = new byte[14];
    int bytesRead = clientStream.Read(message, 0, 14);
}