У меня есть синхронный клиентский сокет, разговаривающий с передатчиком 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);
В дополнение к моему вопросу. После получения тайм-аута я могу вызвать tcpSocket.Disconnect, и на устройстве нет подключенных клиентов, поэтому, похоже, есть еще рукопожатия. – Leonx
используйте wirehark или эквивалент, чтобы узнать, возвращается ли какой-либо трафик после отправки «SomeText». Если ответа нет, то 'Receive' ведет себя как ожидалось –
Спасибо. На самом деле я попробовал отправить « », ожидая сообщения , указывающего успех или ошибку. Я также попытался отправить « ..." текст, который представляет собой еще один набор действительных сообщений для устройства, но ответа еще нет. –
Leonx