Привет
Задача обеспечить бесперебойный обмен сообщениями между сервером и клиентом
Возникла реальные проблемы
1) Периодически клиент не получает сообщение от сервера, сервер зависает.
На сервере: Функция получения сообщения возвращает=0; Решаю принудительным закрытием / открытие порта и включением повторной прослушки;
на клиенте. если функция получения сообщение = -1, закрытие сокета и повторное, открытие сокета и повторная отправка.
В среднем на 10000 сообщений обмена приходится 15 таких ошибок. Очень хочется свести это к нулю, так как обмен происходит в локальной сети, а когда происходит ошибка происходит подвисание на +- секунду.
2) Более критическая ошибка обнаружилась в следующем. Рандомно после несколько тысяч сообщений, клиент не может открыть сокет на сервере и подвисает. Я пытаюсь решить проблему переподключением к сокету, НО клиент не может переподключиться ровно 12678 раз.
Причем, после ровно 12678 попыток открытия и закрытия сокета, сокет открывается. Это не зависит от времени(если нет sleep(1) около 2 секунд ), можно поставить хоть sleep(10) и тем самым пройдет много времени (~40 сек) за эти попытки. важно только чтобы было сделано 12678 попыток после этого сервер опять заработает.
Важно! Пока делается 12678 попыток интернет на клиенте полностью становится недоступным. Это серьезная проблема.
Прошу помощи.
Я написал, тестовые версии клиента и сервера,
происходит обмен сообщениями (номер сообщения) по порядку, после каждого сообщения, тело сообщения увеличивается на 1; Клиент отправляет 1, ждет 1, отправляет 2, ждет 2 итп.
Также выводится в textout текущие сообщение, полученное сообщение, ошибки отправки, получения, открытия.
Также я методом (тыка ) теста, обнаружил, что если не закрывать сокет, то кол-во ошибок приемки заметно меньше.
Ниже код:
Сервер (Отобразить) CODE:
char recvs[120]; //массив в который принимаем
char sends[120]; //массив который передаем
int flag_recv=0;
int i=0;
int checkerror=0;
string TESTINFO="";
disablelistenport();
enablelistenport(12059);//включили прослушку порта
recvport (#recvs[0], 120, #flag_recv); //начали слушать. в отдельном потоке
textout(2,50,30,"Сервер активен", 1);
loop() {
sleep(1);
// Перезапуск, в случае подвисания, Если убрать блок, сервер будет зависать намертно
if (flag_recv==0) {
checkerror++;
disablelistenport();
enablelistenport(12059);
recvport (#recvs[0], 120, #flag_recv);
textout(0,50,50,"Кол-во ошибок приема сообщения: "+format(checkerror), 1);
}
if (flag_recv==1) {
flag_recv=0;
i++;
//TESTINFO="Отправили: "format(i)+" | Получили: "+format(#recvs[0])+"||, "+TESTINFO;
TESTINFO="Отправили: "+format(i)+" | Получили: "+format(#recvs[0]);
textout(1,50,70,TESTINFO, 1);
strcpy(#sends[0],format(i)); // Формируем строку для отправки
sendport (#sends[0], 120);
recvport (#recvs[0], 120, #flag_recv); // опять слушаем
}
}
клиент (Отобразить)CODE:
string IP="192.168.149.240";
closesocket();
char sends[120]; initialarray(#sends[0], 48);
char recvs[120]; initialarray(#recvs[0], 48);
int i=0;
int checkopen=0;
int checkrecv=0;
int checksend=0;
loop () {
string ERROR="";
try:;
sleep(1);
i++; strcpy(#sends[0],format(i)); // Формируем строку для отправки
if (opensocket (IP, 12059)!=1) { ERROR="OPEN"; checkopen++; closesocket(); i--; textout(3,50,110,format(checkopen) + " OPEN ERROR | ПОКА ДЕЙСТВУЕТ ОШИБКА НЕТ ИНТЕРНЕТА", 1); goto try; }
if (sendhtml(#sends[0], 120)==-1) { ERROR="SEND"; checksend++; closesocket(); i--; goto try; }
if (recvhtml(#recvs[0], 120)==-1) { ERROR="RECV"; checkrecv++; closesocket(); i--; goto try; }
jump:;
//closesocket();
textout(0,50,50,"Отправили: "+format(i) + "| Получили: " +format(#recvs[0])+" ["+ERROR+"]", 1);
textout(2,50,90,"error open = "+format(checkopen)+" | error resv = "+format(checkrecv)+ " | error send = " + format(checksend), 1);
}