簡體   English   中英

為什么TcpClient的此代碼在vb.net中有效,而在c#中卻無效?

[英]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.

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