簡體   English   中英

C#套接字讀取錯誤

[英]C# socket read error

在我的程序中,我正在創建套接字,並在客戶端連接時創建了新線程,並嘗試從該套接字讀取/寫入連接到該套接字,但是由於主機已關閉第二條命令的連接,總是會出現讀取錯誤來自客戶端的命令很好,並且第三次正常。 我嘗試檢查clientSocket是否已連接以及networkStream是否可讀,並且它們始終返回true。 我該如何解決? 以及如何-networkStream.CanRead返回true,但networkStreamRead引發錯誤? 我是C#和套接字編程的新手,所以對這個愚蠢的問題感到抱歉。

clientSocket是一個TcpClient
networkStream是一個NetworkStream

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);
   }

}

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是否是來自客戶端的所有數據,但這完全取決於協議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM