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