【问题标题】:C# socket read errorC# 套接字读取错误
【发布时间】:2010-08-19 03:18:55
【问题描述】:

在我的程序中,我正在创建套接字并且客户端连接时我正在创建新线程并尝试从/向连接到此套接字进行读取和写入,但由于主机第二次关闭连接,所以总是出现读取错误命令,来自客户端的第一个命令很好,第三个工作正常。我尝试检查 clientSocket 是否已连接以及 networkStream 是否可读并且它们总是返回 true。我该如何解决这个问题?它怎么可能 - networkStream.CanRead 返回 true 但 networkStreamRead 引发错误?我是 C# 和套接字编程的新手,很抱歉这个愚蠢的问题。

clientSocketTcpClient
networkStreamNetworkStream

if (clientSocket.Connected == true)
{
   requestCount = requestCount + 1;
   networkStream = clientSocket.GetStream();
   if (networkStream.CanRead == true)
   {
         networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
         dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
   }

}

【问题讨论】:

  • clientSocket.ReceiveBufferSize 的值是多少? bytesFrom 是否足够大以接受这么多字节?
  • >>networkStream.CanRead 返回 true 但 networkStreamRead 引发错误?请给出错误的详细信息。

标签: c# multithreading sockets


【解决方案1】:

NetworkStream.CanRead 属性仅表示流支持读取,并不意味着数据可用。从网络读取时,您始终必须继续读取,直到整个帧完成,其中帧的含义完全取决于协议:它可能意味着前导码大小的标头、像 \0x0A 这样的终止符或像单个点这样的特殊序列在一条线上。当帧不完整时,您必须继续发布接收缓冲区,或者如果使用流式 API,则从流中读取。

第二个问题是您显然必须限制自己解释您收到的字节,而不是整个发布的缓冲区。 NetworkStream.Read 返回到目前为止接收到的实际可用字节数,缓冲区中的任何内容都是垃圾:

networkStream = clientSocket.GetStream();
int bytesReceived = networkStream.Read(
   bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
dataFromClient = System.Text.Encoding.ASCII.GetString(
   bytesFrom, 0, bytesReceived);

这仍然不能正确处理帧分隔符,因为您不知道 dataFromClient 是否是所有来自客户端的数据,但这完全取决于协议。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多