TCP: Стоит ли использовать Out-Of-Band? Можно ли на 1 сокет создать 2 потока recv-recv или send-send, если один из recv (send) будет OOB?

423
19 января 2017, 02:20

Есть 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.

READ ALSO
подобие include c#, wpf

подобие include c#, wpf

Добрый день, есть TabPanel и 3 TabItem'a, кода в них довольно много, поэтому хочется их как-то разделить, возможно ли в c# сделать чтобы на каждый tabItem...

394
Byte array перевести в Bitmap и сохранить на диск

Byte array перевести в Bitmap и сохранить на диск

У меня есть массив байтов, который нужно перевести в картинку и сохранитьТаких массивов несколько

600
C# Winforms прокрутка ComboBox

C# Winforms прокрутка ComboBox

Как запретить прокрутку в ComboBox, когда курсор находится над ним и при этом продолжать прокручивать главную формуДело в том, что при выборе...

545
Установка фокуса ввода на контрол winforms [требует правки]

Установка фокуса ввода на контрол winforms [требует правки]

Существует ли метод, который задает фокус ввода элемента управления?

370