Есть heartbeat между сервером и клиентом. Есть команды которые шлются на клиент и на которые шлются ответы на сервер. Сейчас у меня есть алгоритм такого плана:
void server() {
send("server-heartbeat");
while (true) { switch(read()) {
case "client-heartbeat":
if (!tosend_queue.empty) {
while (!tosend_queue.empty) send(tosend_queue.nextCommand());
continue; //dont send heartbeat if cmd sent
}
send("client-heartbeat-response");
case "server-heartbeat-response":
if (!tosend_queue.empty) {
while (!tosend_queue.empty) send(tosend_queue.nextCommand());
continue; //dont send heartbeat if cmd sent
}
send("server-heartbeat");
case "command-response":
send("server-heartbeat"); //чтобы не зависло read навсегда
}}
}
void client() {
send("client-heartbeat");
while (true) switch(read()) {
case "server-heartbeat":
send("server-heartbeat-response");
case "client-heartbeat-response":
send("client-heartbeat");
case "command":
send("command-response");
}
}
Сначала я делал heartbeat'ы, с ними все сносно получилось и все работает (если не считать того, что нет таймаута на read и есть малейшая вероятность, что при каких-то "тормозах" компьютера send вызовется и успешно получит ACK до вызова read, а обрыв произойдет уже после и read так и будет WAIT).
Но теперь надо прикрутить сами команды, что я и делаю, а получается пока только вот такой огород, там пока вообще дофига не продумано и при стечении обстоятельств может где-то зависнуть ожидание, а сам процесс продумки похож на лепку из пластилина и моему мозгу дается тяжело...
Может, стоит применить OOB, чтобы был не один цикл, а два в разных потоках - в одном heartbeat'ы, а в другом отдельно алгоритм с командами?
Знаю, что нельзя просто вызывать send на один сокет в двух потоках сразу, также и recv, а мьютексы... как-то в голове уже не помещается все это, что вообще делать.
А вот если опять же 1 сокет, 2 потока одновременно, но в одном send просто, а в другом send OOB, или аналогично с recv, то так - можно?
Пугает нераспространенность OOB, в ОС-то он вроде есть во всех популярных, но вот в .NET (а я пишу на C#) на уровне TcpClient и TcpListener его уже нет, только через Socket - более низкоуровневый класс, враппер WinAPI.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Добрый день, есть TabPanel и 3 TabItem'a, кода в них довольно много, поэтому хочется их как-то разделить, возможно ли в c# сделать чтобы на каждый tabItem...
У меня есть массив байтов, который нужно перевести в картинку и сохранитьТаких массивов несколько
Как запретить прокрутку в ComboBox, когда курсор находится над ним и при этом продолжать прокручивать главную формуДело в том, что при выборе...
Существует ли метод, который задает фокус ввода элемента управления?