Подключение к GSM модему через сокеты - C#
Формулировка задачи:
Добрый день. Помогите разобраться с проблемой. Я подключаюсь к модему для того чтобы передать сообщение. Алгоритм работы такой: сообщение поступает в очередь которую мониторит вторичный поток, проверяется наличие соединения с модемом, если соединения нет, происходит подключение к нему синхронным методом, затем отправляется сообщение и соединение закрывается. Все работает как и должно, но в какой-то момент после долгого простоя в программе возникает исключение во время отправки поступившего сообщения:
1. The operation is not allowed on non-connected sockets.
2. No connection could be made because the target machine actively refused it 10.81.134.61:4001
Т.е я так понимаю ситуация такая: поступило сообщение, проверяется наличие соединения с модемом, его нет, вызывается:
Этот метод отрабатывает нормально, мы пытаемся отправить сообщение и выскакивает ошибка 1.
В случае ошибки мы разрываем соединение и открываем новое, но открыть новое не можем потому что соединение уже есть и следовательно возникает ошибка 2. Как так ведь из сообщения 1 следует что соединение так и не было открыто? Вот участок кода отправки сообщения:
client = new TcpClient();
client.Connect(config.Host, config.Port);
//Чтоб метод Read не блокировал на долго программу
client.ReceiveTimeout = 10000;
stream = new ClearedStreamReader(client.GetStream()); /// <summary>
/// Проверка очереди сообщений, и отправка имеющихся сообщений
/// </summary>
private void MsgQueueChecker()
{
Notice data = null;
while (isLoop)
{
try
{
if (msgQueue != null && msgQueue.Count != 0)
{
//Если соедиенения нет открываем его
if (!plugin.IsConnected)
{
plugin.Connect();
}
//сперва получаем объект и если отправка прошла успешно только тогда удалим
lock (locker)
{
data = (Notice)msgQueue.Peek();
if (data == null)
{
OnDebug("Список сообщений пуст");
continue;
}
//Если сообщение в очереди больше 60 минутт не отправляем его
if (isOldMessages(data, 60))
{
if (msgQueue.Count > 0)
msgQueue.Dequeue();
OnDebug("Удаление старого сообщения. ");
continue;
}
}
OnDebug("Отправка сообщения");
if (plugin.Send(data))
{
OnMessageSended(data);
OnEventInfo("Сообщение отправлено");
lock (locker)
{
if (msgQueue.Count > 0)
msgQueue.Dequeue();
}
}
else
{
OnEventWarrning("Сбой отправки сообщения.");
if (plugin.IsConnected)
{
plugin.Disconnect();
}
Thread.Sleep(5000);
}
}
else
{
if (plugin.IsConnected)
{
plugin.Disconnect();
}
Thread.Sleep(5000);
}
}
catch (Exception ex)
{
OnEventError(ex.Message);
if (plugin.IsConnected)
{
plugin.Disconnect();
}
Thread.Sleep(5000);
}
}
if (plugin.IsConnected)
{
plugin.Disconnect();
}
}Решение задачи: «Подключение к GSM модему через сокеты»
textual
Листинг программы
AT+CGATT=1
AT#APNSERV="xxxx"
AT#APNUN="yyyy"
AT#APNPW="zzzz"
AT#CONNECTIONSTART
{ Подсоединение к TCP- cерверу }
AT#DLEMODE=1,0
AT#TCPSERV=1,"xxx.xxx.xxx.xxx"
AT#OTCP=1