![](/img/trans.png)
[英]Why does this If condition in VB.NET always evaluates to true and the same code in C# does not
[英]Why does this code for TcpClient work in vb.net, but not c#?
這里有一個小實驗,我繼承並計划重構的代碼,但是我迷上了一件事。 vb.net
的一個有效,但c#
中的一個無效。
順便說一句, BUFFER_SIZE
等於2048 ,我知道它有幾個問題,但是我只能假設我誤解了兩種語言的Byte
構造之間的相關性:
Dim bytesRcvd As Integer = 0
Dim byteSendBuffer As Byte() = New Byte(BUFFER_SIZE - 1) {}
Dim byteReceiveBuffer As Byte() = New Byte(BUFFER_SIZE - 1) {}
Dim receiveMessage As String = Nothing
byteSendBuffer = Encoding.ASCII.GetBytes(sendMessage)
Dim client As System.Net.Sockets.TcpClient = Nothing
Dim netStream As System.Net.Sockets.NetworkStream = Nothing
client = New System.Net.Sockets.TcpClient("localhost", 9060)
netStream = client.GetStream()
netStream.Write(byteSendBuffer, 0, byteSendBuffer.Length)
bytesRcvd = netStream.Read(byteReceiveBuffer, 0, BUFFER_SIZE)
receiveMessage = Encoding.ASCII.GetString(byteReceiveBuffer, 0, bytesRcvd)
netStream.Close()
client.Close()
C#:
int bytesRcvd = 0;
var byteSendBuffer = new Byte[BUFFER_SIZE - 1];
var byteReceiveBuffer = new Byte[BUFFER_SIZE - 1];
string receiveMessage = null;
byteSendBuffer = Encoding.ASCII.GetBytes(sendMessage);
System.Net.Sockets.TcpClient client = null;
System.Net.Sockets.NetworkStream netStream = null;
client = new System.Net.Sockets.TcpClient("localhost", 9060);
netStream = client.GetStream();
netStream.Write(byteSendBuffer, 0, byteSendBuffer.Length);
bytesRcvd = netStream.Read(byteReceiveBuffer, 0, BUFFER_SIZE);
receiveMessage = Encoding.ASCII.GetString(byteReceiveBuffer, 0, bytesRcvd);
netStream.Close();
client.Close();
收到的錯誤是:
指定的參數超出有效值范圍。
這發生在netStream.read
是的,所以Byte
的處理方式有所不同。.着重於c#版本,更改為:
var byteSendBuffer = new Byte[BUFFER_SIZE - 1];
var byteReceiveBuffer = new Byte[BUFFER_SIZE - 1];
對此:
var byteSendBuffer = new Byte[BUFFER_SIZE];
var byteReceiveBuffer = new Byte[BUFFER_SIZE];
沒有錯誤,但是netStream.read
無限期掛起,因此顯然沒有獲取任何數據,對嗎?
我嘗試用以下方法包裝所有內容:
if(netStream.CanRead()) { ... }
沒有工作,仍然掛起。
你能找到原因嗎? 同樣,是的,我知道這很丑。 我會解決的。
更新資料
這絕對令人沮喪。 我已經嘗試了許多建議的配置示例。 在新的c#
(或以前)解決方案中,我添加了一個僅用於TcpClient命令的vb
項目。 不管還有什么我做什么,無限期地掛在read
,但作品vb
。
最終更新
好吧,所有這些麻煩和有用的建議,轉而這是處理小細節的巨大重大巧合之一,就像在我無法訪問的另一端的收聽服務中一樣。 返回要發送給偵聽器的消息的過程返回了不正確的消息,並且偵聽器未使用數據進行響應,並且超時了。 如此微小的細節(如幾個字符)很難被發現。
嘗試這個
bytesRcvd = netStream.Read(byteReceiveBuffer, 0,
byteReceiveBuffer.Length);
代替
bytesRcvd = netStream.Read(byteReceiveBuffer, 0,
BUFFER_SIZE );
您的byteReceiveBuffer長度為2047,BUFFER_SIZE為2048
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.