Почему этот код для TcpClient работает на vb.net, а не на c #? - PullRequest
0 голосов
/ 23 мая 2018

Небольшой эксперимент здесь, код, который я унаследовал и планирую реорганизовать, но я нахожусь в тупике с одной стороны.Один в 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# (или было) я добавил проект vb только для команд TcpClient.Независимо от того, что еще я делаю, он зависает на read бесконечно, но работает с vb.

Окончательное обновление

Ну, все это хлопотно и полезносовет, и оказывается, это было одно из тех огромных совпадений, связанных с мелкими деталями, как в службе прослушивания на другом конце, к которой у меня не было доступа.Процедура возврата сообщений, отправляемых слушателю, возвращала неверные сообщения, и слушатель не отвечал данными, а время просто истекло.Такая крошечная деталь (вроде нескольких символов), что ее было трудно разглядеть.

1 Ответ

0 голосов
/ 23 мая 2018

Попробуйте это

 bytesRcvd = netStream.Read(byteReceiveBuffer, 0,
 byteReceiveBuffer.Length);

Вместо

bytesRcvd = netStream.Read(byteReceiveBuffer, 0,
     BUFFER_SIZE );

длина вашего byteReceiveBuffer равна 2047, а BUFFER_SIZE - 2048

...