![](/img/trans.png)
[英]C# socket read buffer error with multiple clients connecting to servers
[英]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.