В какой-то степени это вопрос "основы TCP", но в то же время мне еще предстоит найти убедительный ответ в другом месте и считаю, что у меня хорошее/хорошее понимание основ TCP. Я не уверен, что сочетание вопросов (или один вопрос, и пока я нахожусь на его просьбе о подтверждении пары баллов) противоречит правилам. Надеюсь, что нет.
Я пытаюсь написать реализацию С# для TCP-клиента, который взаимодействует с существующим приложением, содержащим TCP-сервер (у меня нет доступа к его коду, поэтому нет WCF). Как я могу подключиться к нему, отправлять и получать по мере необходимости, когда новая информация поступает или выходит, и в конечном итоге отключается. Используя следующий код MSDN в качестве примера, где они перечисляют асинхронные методы "Отправить" и "Получать" (или просто TcpClient) и игнорируют подключения и отключить, как тривиально, как я могу лучше всего продолжать проверку новых полученных пакетов и в то же время отправлять по мере необходимости?
Первоначально я использовал TCPClient и GetStream(), а код msdn по-прежнему требует, чтобы цикл и сон описывались бит (счетчик интуитивно), где я запускаю метод приема в цикле в отдельном потоке со сном ( 10) миллисекунд, и при необходимости отправьте в основной (или третьей) поток. Это позволяет мне отправлять штрафы, а метод получения эффективно опросает через регулярные интервалы для поиска новых пакетов. Полученные пакеты затем добавляются в очередь.
Это действительно лучшее решение? Должен ли быть эквивалент события DataAvailable (или чего-то, чего я не вижу в коде msdn), который позволяет нам получать, когда и только когда есть новые данные?
В качестве запоздалой мысли я заметил, что сокет можно вырезать с другой стороны, если клиент не узнает до следующей неудачной отправки. Чтобы уточнить, клиент обязан отправлять регулярные keepalives (и получать недостаточно, только отправлять), чтобы определить, жив ли сокет. И частота keepalive определяет, как скоро я узнаю, что ссылка не работает. Это верно? Я попробовал опрос Poll, socket.connected и т.д., Чтобы узнать, почему каждый просто не помогает.
Наконец, чтобы подтвердить (я считаю, что это нехорошо убедиться), в вышеуказанном сценарии отправки по запросу и при получении, если tcpclient.DataAvailable каждые десять секунд, может ли быть потеря данных при отправке и получении в одно и то же время? Если в то же время я получаю, что я пытаюсь отправить, будет один отказ, перезаписать другое или любое другое такое нежелательное поведение?