TCP клиентът не получава отговор при обратна връзка

Имам TCP сървър, който работи на localhost на vs2010 на Windows 2k8.

Когато свържа клиента на 127.0.0.1 с помощта на vs2010, сървърът получава обаждането (виждам го от отстраняване на грешки), тъй като tcp сървърът изпълнява манипулатора на протокола на командния ред, но клиентът получава отговора на сървъра, който е сесията ключ, но блокира при клиента, когато чете потока от отговори.

Когато използвам Telnet при обратна връзка за същия порт, изпращайки същата командна последователност, отговорът, т.е. ключът на сесията, се получава мигновено.

Ето кода на клиента:

EndPoint serverAddress = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9121);
sing (Socket socket = new Socket(serverAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp))
            {

                socket.Connect(serverAddress);

                var socketStream = new NetworkStream(socket);
                var reader = new StreamReader(socketStream, Encoding.ASCII, false);
                var writer = new StreamWriter(socketStream, Encoding.ASCII, 1024);

                string charSource = Guid.NewGuid().ToString().Replace("-", string.Empty)
                   + Guid.NewGuid().ToString().Replace("-", string.Empty)
                   + Guid.NewGuid().ToString().Replace("-", string.Empty);

                Random rd = new Random();


                int startPos = rd.Next(0, charSource.Length - 2);
                int endPos = rd.Next(startPos + 1, charSource.Length - 1);

                var currentMessage = charSource.Substring(startPos, endPos - startPos + 1);

                Console.WriteLine("Sent Command");

                writer.Write("HEAR {0} {1}", currentMessage.Length.ToString().PadLeft(4, '0'), currentMessage);
                writer.Flush();

                Console.WriteLine("Reading Command Results");
                var line = reader.ReadLine();
                Console.WriteLine("Received: " + line);
            }

Боб


person scope_creep    schedule 26.02.2012    source източник
comment
Никога не можем да отговорим на това. Но бихме могли, ако покажете съответния код.   -  person nos    schedule 26.02.2012
comment
Пропускате много информация във въпроса. Може да има дузина променливи, които допринасят за вашия липсващ отговор. Как да познаем?   -  person Jason    schedule 26.02.2012
comment
Да, това си помислих. Ще публикувам клиентския код.   -  person scope_creep    schedule 26.02.2012
comment
Изпращате ли cr и/или lf, които ReadLine() чака?   -  person 500 - Internal Server Error    schedule 29.02.2012
comment
Ако ще четете редове, вие също трябва да пишете редове.   -  person David Schwartz    schedule 29.02.2012
comment
Неизпращане на cr/lf умишлено. Командата е във формат ‹Command› ‹DataLength› ‹Data› напр. HEAR 0004 jssa, HEAR е CLP команда за звуков ритъм. Тествах сървъра с TCPBuilder, който е тестер на сокети, и сървърът работи добре. Нещо липсва в този тъп код.   -  person scope_creep    schedule 01.03.2012


Отговори (2)


За да работи това, моля, променете Write с WriteLine, както е показано в кода по-долу:

 Console.WriteLine("Sent Command");

 writer.WriteLine("HEAR {0} {1}", currentMessage.Length.ToString().PadLeft(4, '0'), currentMessage);
 writer.Flush();
person ogggre    schedule 29.02.2012
comment
Опитах да настроя и двете на WriteLine. Клиентът седи и чака. Със сигурност флъшът записва буферния поток в канала. - person scope_creep; 01.03.2012
comment
Изтеглих TCPIP builder и сървърът работи добре. Препоръчвате ли примерни .NET TCP/P сокет клиенти. - person scope_creep; 01.03.2012
comment
Създадох клиент с помощта на клас TcpClient, който работи добре. Сървърът работи и изпраща правилния отговор на сесията. - person scope_creep; 01.03.2012
comment
Окончателното решение беше да се добави нов ред в отговора на сесията. След това клиентът работи добре и откри, че тестовият код преминава, но е грешен. Благодаря. - person scope_creep; 02.03.2012

Активирайте мрежовото проследяване, за да сте сигурни, че данните идват. Вероятно е така, така че променете обаждането си до reader. Четете и четете, докато намерите края на съобщението.

person Fernando    schedule 01.03.2012
comment
Благодаря за това. Не го бях виждал преди. - person scope_creep; 02.03.2012