2014-09-01 2 views
0

У меня есть синхронный клиентский сокет, разговаривающий с передатчиком LRS (Long Range Systems), он принимает вход XML и соединение TCPIP. Я могу создать соединение с устройством и получить ответ после его подключения; но когда я попытался отправить некоторые тексты и снова позвонить «Получать», никакого ответа или, в конечном итоге, тайм-аута. Не могли бы вы объяснить, почему?Синхронный вызов второго приема() не возвращается/время ожидания

Мой пример кода:

Socket tcpSocket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
System.Net.IPAddress[] IPs = System.Net.Dns.GetHostAddresses("valid_IP_address"); 
tcpSocket.Connect(IPs[0], PORT_NUMBER); 
int nBytes = 0; 
byte[] RcvBytes = new byte[BUF_SIZE]; 
if (tcpSocket.Connected) 
{ 
    tcpSocket.ReceiveTimeout = 60000; //1 minute timeout 
    //connected is true and below Receive call returns some bytes 
    //RcvBytes contains a valid response, ie, <LRSN services="blah, blah" ... /> 
    nBytes = tcpSocket.Receive(RcvBytes, 0, tcpSocket.Available, SocketFlags.None); 
} 

//below Send returns 8 bytes, the lenth of "SomeText" 
nBytes = tcpSocket.Send(Encoding.ASCII.GetBytes("SomeText")); 

//*** FAILS, below Receive call never returns, eventually time out 
nBytes = tcpSocket.Receive(RcvBytes, 0, tcpSocket.Available, SocketFlags.None); 
+0

В дополнение к моему вопросу. После получения тайм-аута я могу вызвать tcpSocket.Disconnect, и на устройстве нет подключенных клиентов, поэтому, похоже, есть еще рукопожатия. – Leonx

+0

используйте wirehark или эквивалент, чтобы узнать, возвращается ли какой-либо трафик после отправки «SomeText». Если ответа нет, то 'Receive' ведет себя как ожидалось –

+0

Спасибо. На самом деле я попробовал отправить «», ожидая сообщения , указывающего успех или ошибку. Я также попытался отправить « ..." текст, который представляет собой еще один набор действительных сообщений для устройства, но ответа еще нет. – Leonx

ответ

1

Я думаю, что вы, вероятно, столкнуться с этой проблемой:

LRSN транспорта сообщений Все сообщения являются XML на основе. С некоторыми анализаторами XML сложно обрабатывать непрерывный поток XML. Чтобы облегчить обработку входящих сообщений , используется следующая схема обрамления сообщения: : • Символы новой строки ('\ n') используются для разграничения конца сообщения . Данные между двумя новыми строками должны формировать анализируемый XML-документ (т. Е. Все теги сбалансированы).

Так что попробуйте отправить несколько строк.

+0

Но я просто отправляю простое сообщение для входа ниже: ' ' Я получаю сообщение , но ничего не получено. Похоже, что передатчик не понимает отправленное мной сообщение и полностью игнорирует его. Может кто-нибудь, пожалуйста, разместите рабочий образец, поскольку я не смог найти какой-либо ресурс в сети. Благодарю кучи! – Leonx

+0

Каждое сообщение, включая сообщение для входа, должно быть завершено символом новой строки/строки «\ n» (ASCII 10). Вы не получите , пока не отправите ' \ n' –

+0

OMG, я не мог поверить, что это причина! Я копался в обновленном API doco ... Кстати, я не мог его найти. Большое спасибо за решение этого мифа! – Leonx

Смежные вопросы